问题:可能逆元不存在吗?
题解:
Gcd(a,b)==Gcd(b,a-b);
从数据范围可以看出应该求M!的欧拉函数;
然后通过Gcd转化过去
一开始没想到
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long Lint; const int maxT=20000; const int maxn=10000009; int T,r; int mn=0,mm=0; int inn[maxT]; int inm[maxT]; Lint fac[maxn]; int vis[maxn]= {0}; int prime[maxn],cntprime=0; int Lineshake() { vis[1]=1; for(int i=2; i<=mm; ++i) { if(!vis[i]) { prime[++cntprime]=i; } for(int j=1; (j<=cntprime)&&(i*prime[j]<=mm); ++j) { vis[i*prime[j]]=1; if(i%prime[j]==0)break; } } } Lint ksm(Lint a,Lint p) { Lint ret=1; for(; p; p>>=1,a=a*a%r) { if(p&1)ret=ret*a%r; } return ret; } Lint inv(Lint x) { return ksm(x,r-2); } Lint phi[maxn]; int main() { scanf("%d%d",&T,&r); for(int i=1; i<=T; ++i) { scanf("%d%d",&inn[i],&inm[i]); mn=max(mn,inn[i]); mm=max(mm,inm[i]); } fac[1]=1; for(int i=2; i<=mn; ++i)fac[i]=fac[i-1]*i%r; Lineshake(); phi[1]=1; for(int i=2; i<=mm; ++i) { if(!vis[i]) { phi[i]=phi[i-1]*(i-1)%r*inv(i)%r; } else { phi[i]=phi[i-1]; } } for(int i=1; i<=T; ++i) { printf("%lld\n",fac[inn[i]]*phi[inm[i]]%r); } return 0; }