rt,开 O2 后 #1WA + 其余 RE,关 O2 后 AC。
若将 getC 函数中 g 数组的使用换为 f 数组直接求逆元,则开 O2 也能 AC。为什么?
#include <bits/stdc++.h>
#define il inline
namespace Fast_IO {
template <typename T> il void read(T &x) {
x = 0; int f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) x = x * 10 + (ch - 48), ch = getchar();
x = f ? -x : x;
}
template <typename T, typename ...Args>
il void read(T &x, Args& ...args) {read(x), read(args...);}
template <typename T> il void write(T x, char c = '\n') {
if (x) {
if (x < 0) x = -x, putchar('-');
char a[30]; short l;
for (l = 0; x; x /= 10) a[l ++] = x % 10 ^ 48;
for (l --; l >= 0; l --) putchar(a[l]);
} else putchar('0');
putchar(c);
}
} using namespace Fast_IO;
using namespace std;
#define int long long
const int Maxn = 100005;
int f[Maxn], g[Maxn];
il int ksm(int a, int b, int p) {
int res = 1;
for (; b; b >>= 1, a = a * a % p)
if (b & 1) res = res * a % p;
return res;
}
il void Init(int n, int m, int p) {
f[0] = g[0] = 1;
for (int i = 1; i <= n + m; i ++)
f[i] = f[i - 1] * i % p, g[i] = g[i - 1] * ksm(i, p - 2, p) % p;
}
il int getC(int n, int m, int p) {return f[n] * g[n - m] % p * g[m] % p;}
int lucas(int n, int m, int p) {
if (m == 0) return 1;
return lucas(n / p, m / p, p) * getC(n % p, m % p, p) % p;
}
il void solve() {
int n, m, p;
read(n, m, p);
Init(n, m, p);
write(lucas(n + m, n, p));
}
signed main() {
int T; read(T);
while (T --) solve();
return 0;
}