luoguB3717 N在1E6以内的组合数
给出T次询问,每次给出n和m,求C(n,m)对998244353取模的结果。为了避免输出太多内容,只需要输出所有查询结果的异或和。
1<=T<=5E6; 0<=m<=n<=5E6
n为百万级、p为大质数,需要多次求组合数,一般先O(n)预处理出所有数的阶乘及其对应的乘法逆元,然后O(1)处理每次询问。
#include <bits/stdc++.h>
using i64 = long long;
const int MOD = 998244353;
const int Z = 5000005;
i64 T, N, fac[Z], ifac[Z];
int comb(int n, int m) {
    return fac[n] * ifac[m] % MOD * ifac[n - m] % MOD;
}
int power(int a, int b) {
    i64 r = 1, t = a;
    for (; b; b /= 2) {
        if (b & 1) r = r * t % MOD;
        t = t * t % MOD;
    }
    return r % MOD;
}
void solve() {
    std::cin >> T >> N;
    fac[0] = 1;
    for (int i = 1; i <= N; i++) {
        fac[i] = fac[i-1] * i % MOD;
    }
    ifac[N] = power(fac[N], MOD - 2);
    for (int i = N - 1; i >= 0; i--) {
        ifac[i] = ifac[i+1] * (i+1) % MOD;
    }
    int ans = 0;
    while (T--) {
        int n, m;
        std::cin >> n >> m;
        ans ^= comb(n, m);
    }
    std::cout << ans << "\n";
}
int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}
                    
                
                
            
        
浙公网安备 33010602011771号