线性求逆元+欧拉函数
关于线性求逆元:
http://blog.miskcoo.com/2014/09/linear-find-all-invert
http://blog.youkuaiyun.com/whyorwhnt/article/details/19169035
本题题解:
http://blog.youkuaiyun.com/PoPoQQQ/article/details/39957117
本题卡内存+卡时,注意优化- -
#include<cstdio>
#define N 10000005
using namespace std;
long long inv[N], fac[N], pre[N], p;
int prime[670000], cnt=0;
bool vis[N];
void init()
{
fac[1]=1;
for(int i = 2; i < N; i++)
fac[i]=fac[i-1]*i%p;
for(int i = 2; i < N; i++)
{
if(!vis[i])
prime[++cnt]=i;
for(int j = 1; j <= cnt && prime[j]*i<N; j++)
{
vis[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
inv[1]=1;
for(int i = 2; i < N && i< p; i++)
inv[i]=inv[p%i]*(p-p/i)%p;
pre[1]=1;
for(int i = 2; i < N; i++)
{
if(!vis[i])
pre[i]=pre[i-1]*(i-1)%p*inv[i]%p;
else
pre[i]=pre[i-1];
}
}
int main()
{
int T;
scanf("%d%lld",&T,&p);
init();
while(T--)
{
int n, m;
scanf("%d%d",&n,&m);
printf("%lld\n",fac[n]*pre[m]%p);
}
}