求 m! 模 p 的值。 数据保证 ∣m−p∣≤1000 ,m≤3×109 。 有以下代码,但不知道式子是什么推出来的,问了同学但貌似没听很多,好像要运用威尔逊定理。
#include <bits/stdc++.h>
using namespace std;
long long qpow(long long a, long long b, long long p) {
long long ans = 1;
while (b) {
if (b & 1)
ans = ans * a % p;
a = a * a % p;
b >>= 1;
}
return ans;
}
int main() {
freopen("factorial.in", "r", stdin);
freopen("factorial.out", "w", stdout);
cin.tie(0)->sync_with_stdio(0);
int T;
cin >> T;
while (T--) {
long long m, p;
cin >> m >> p;
if (m >= p)
cout << 0 << '\n';
else {
long long ans = p - 1;
for (long long i = p - 1; i > m; i--) ans = 1ll * ans * qpow(i, p - 2, p) % p;
cout << ans << '\n';
}
}
return 0;
}
祝您 NOIP2023 rp++