求助,关于乘法逆元
  • 板块灌水区
  • 楼主farfarqwq
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/6/25 17:52
  • 上次更新2023/10/27 22:35:56
查看原帖
求助,关于乘法逆元
378951
farfarqwq楼主2022/6/25 17:52

今天我学了卡特兰数,在递推求第 nn 项时遇到了一个问题:两个数做乘法时不爆 longlong(一个 5×1055\times 10^5,另一个在模数(109+710^9+7)以内)再除以一个数,再取模应该是不爆 longlong 的呀,于是找了道板子题发现只得了 40pts,结果用逆元就全对了,我寻思着逆元不也是两个数乘起来,取模,乘一个数,再取模吗?为什么逆元对了而普通的不对呢?百思不得其解,望大佬们讲一下QWQ

40pts:

#include <bits/stdc++.h>
using namespace std;
long long f[100005];
const int mod = 1e9 + 7;
int main() {
    long long n;
    cin >> n;
    f[0] = f[1] = 1;
    for (long long i = 2; i <= n; i++) f[i] = (i * 4 - 2) * f[i - 1] / (i + 1) % mod;
    cout << f[n];
    return 0;
}

满分:

#include <bits/stdc++.h>
using namespace std;
long long f[100005];
const int mod = 1e9 + 7;
long long ksm(long long x, long long k) {
    if (k == 1)
        return x;
    long long ans = ksm(x, k >> 1);
    ans = ans * ans % mod;
    if (k & 1)
        ans = ans * x % mod;
    return ans;
}
int main() {
    long long n;
    cin >> n;
    f[0] = f[1] = 1;
    for (long long i = 2; i <= n; i++) f[i] = (i * 4 - 2) * f[i - 1] % mod * ksm(i + 1, mod - 2) % mod;
    cout << f[n];
    return 0;
}
2022/6/25 17:52
加载中...