题解:
显然N!N!是M!M!的倍数,答案为φ(M!)∗(N!/M!)φ(M!)∗(N!/M!)。
预处理出11~的质数及逆元还有阶乘
递推求f[m]=φ(m!)∗m!−1f[m]=φ(m!)∗m!−1。
ans=f[m]∗n!ans=f[m]∗n!%PP。
#include<bits/stdc++.h>
#define inf 1000000000
#define N 10000005
#define ll long long
using namespace std;
int mod,n,m,cnt,fac[N],inv[N],pri[N],ans[N],b[N];
int main()
{
int T;
scanf("%d%d",&T,&mod);
fac[1]=inv[1]=1;
for(int i=2;i<=N;i++)fac[i]=(ll)fac[i-1]*i%mod;
for(int i=2;i<=N;i++)
{
if(!b[i])pri[++cnt]=i;
for(int j=1;pri[j]*i<=N&&j<=cnt;j++)
{
b[pri[j]*i]=1;
if(i%pri[j]==0)break;
}
}
for(int i=2;i<=N&&i<mod;i++)
inv[i]=(mod-(ll)mod/i*inv[mod%i]%mod);
ans[1]=1;
for(int i=2;i<=N;i++)
{
ans[i]=ans[i-1];
if(!b[i])ans[i]=(ll)ans[i]*(i-1)%mod*inv[i%mod]%mod;
}
while(T--)
{
scanf("%d%d",&n,&m);
printf("%d\n",(ll)fac[n]*ans[m]%mod);
}
return 0;
}