关于求大数阶乘
  • 板块学术版
  • 楼主GGapa
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/11/15 22:19
  • 上次更新2023/11/16 10:19:27
查看原帖
关于求大数阶乘
597060
GGapa楼主2023/11/15 22:19

求 m!m! 模 pp 的值。 数据保证 ∣m−p∣≤1000|m-p|\le 1000 ,m≤3×109m \le 3 \times10^9 。 有以下代码,但不知道式子是什么推出来的,问了同学但貌似没听很多,好像要运用威尔逊定理。

#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++

2023/11/15 22:19
加载中...