Orz题解
数组开小了坑死人啊卧槽!
#include<iostream>
#include<cstdio>
#define MAXN 10000000
#define ll long long
using namespace std;
int fac[10000005],inv[10000005],ans[10000005];
int n,m,T,R,cnt;
bool flag[10000005];
int prime[1000005];
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
inline void prepare()
{
for (int i=2;i<=MAXN;i++)
{
if (!flag[i]) prime[++cnt]=i;
for (int j=1;i*prime[j]<=MAXN&&j<=cnt;j++)
{
flag[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
fac[1]=1;
for (int i=2;i<=MAXN;i++) fac[i]=(ll)fac[i-1]*i%R;
inv[1]=1;
for (int i=2;i<=MAXN;i++)
if (i<R) inv[i]=R-(ll)R/i*inv[R%i]%R; else break;
ans[1]=1;
for (int i=2;i<=MAXN;i++)
{
ans[i]=ans[i-1];
if (!flag[i]) ans[i]=(ll)ans[i]*(i-1)%R*inv[i%R]%R;
}
}
int main()
{
T=read(); R=read();
prepare();
while (T--)
{
n=read(); m=read();
printf("%d\n",(ll)fac[n]*ans[m]%R);
}
return 0;
}