100分 Sub1WA两个 大佬求调
查看原帖
100分 Sub1WA两个 大佬求调
1802594
Stick_Man_楼主2025/7/23 19:15
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e7+5;

int T,R,cnt,p[MAXN],fac[MAXN],inv[MAXN],ans[MAXN];
bitset<MAXN> vis;

void init(){
    fac[0]=1;
    for(int i=1;i<MAXN;i++)
        fac[i]=1LL*fac[i-1]*i%R;
    
    for(int i=2;i<MAXN;i++){
        if(!vis[i]) p[++cnt]=i;
        for(int j=1;j<=cnt&&1LL*i*p[j]<MAXN;j++){
            vis[i*p[j]]=1;
            if(i%p[j]==0) break;
        }
    }

    inv[1]=1;
    for(int i=2;i<MAXN&&i<R;i++)
        inv[i]=1LL*(R-R/i)*inv[R%i]%R;

    ans[0]=ans[1]=1;
    for(int i=2;i<MAXN;i++){
        ans[i]=ans[i-1];
        if(!vis[i]) ans[i]=1LL*ans[i]*(i-1)%R*inv[i]%R;
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin>>T>>R;
    init();
    while(T--){
        int N,M;
        cin>>N>>M;
        cout<<1LL*fac[N]*ans[M]%R<<"\n";
    }
    return 0;
}

2025/7/23 19:15
加载中...