bzoj2186

题解:

把逆元求出来

然后预处理

代码:

#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
",(ll)fac[n]*ans[m]%R);
     }
    return 0;
}
原文地址:https://www.cnblogs.com/xuanyiming/p/8761680.html