厌氧代码求调
查看原帖
厌氧代码求调
518232
Sternenlicht楼主2024/12/15 22:15

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;
}
2024/12/15 22:15
加载中...