题解:
把逆元求出来
然后预处理
代码:
#include<bits/stdc++.h> const int N=10000005; typedef long long ll; using namespace std; int T,R,n,m,cnt,fac[N],ine[N],pri[N],ans[N],mark[N]; void pre() { fac[1]=1; for (int i=2;i<N;i++)fac[i]=(ll)fac[i-1]*i%R; ine[1]=1; for (int i=2;i<N;i++) { if (!mark[i])pri[++cnt]=i; for (int j=1;pri[j]*i<=N&&j<=cnt;j++) { mark[pri[j]*i]=1; if (i%pri[j]==0)break; } } for (int i=2;i<N&&i<R;i++)ine[i]=(R-(ll)R/i*ine[R%i]%R); ans[1]=1; for (int i=2;i<N;i++) { ans[i]=ans[i-1]; if (!mark[i])ans[i]=(ll)ans[i]*(i-1)%R*ine[i%R]%R; } } int main() { scanf("%d%d",&T,&R); pre(); while (T--) { scanf("%d%d",&n,&m); printf("%d\n",(ll)fac[n]*ans[m]%R); } return 0; }