题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2186
题目大意:求n!中与m!互质的个数模R的值。n,m<=10000000.R为质数,R<=1e9+10
题目分析:我们所要求的答案为phi(m!)*n!/m! 模R的值。我们用线性筛法即可求解。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<bitset> using namespace std; typedef long long LL; const int maxn=10000010; bitset<maxn> mark; LL d[maxn],inv[maxn],ans[maxn]; void Get_Prime() { mark.set(); for (int i=2;i<maxn;i++) if (mark[i]) for (int j=i+i;j<maxn;j+=i) mark[j]=false; } int main() { int T,R; cin>>T>>R; int mod=R; Get_Prime(); d[0]=1; for (int i=1;i<maxn;i++) d[i]=d[i-1]*i %mod; inv[1]=1; for (int i=2;i<maxn;i++) { if (i>=mod) break; inv[i]=(mod-mod/i)*inv[mod%i]%mod; } ans[1]=1; for (int i=2;i<maxn;i++) if (mark[i]) { ans[i]=ans[i-1]*(i-1)%mod; ans[i]=ans[i]*inv[i%mod]%mod; } else ans[i]=ans[i-1]; while (T--) { int n,m; cin>>n>>m; LL res=d[n]*ans[m] % mod; cout<<res<<endl; } return 0; }