BZOJ 2186: [Sdoi2008]沙拉公主的困惑| 数论

来源:互联网 发布:c语言校园导游系统 编辑:程序博客网 时间:2024/05/01 06:08

ans=(phi(m))*(n!/m!)

phi(m!)=m!*(p-1)/p   p为m!的质因数

ans=n!*(p-1)/p   

然后就是求逆元

用费马小定理求得   巨慢如雷电 10秒卡过 ........————————

这里说一下费马小定理求逆元

R是质数

求a关于R的逆元可以用快速幂 

a^(R-2)%R即为a的逆元 

因为 a*a^(R-2)=a^(R-1)=1(mod R) 

好暴力啊……

#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<queue>#include<vector>#include<set>#include<map>#include<algorithm>#include<iostream>#define P 10000000#define ll long longusing namespace std;bool prime[P+10];int fac[P+10],ine[555555],pri[555555],ans[P+10];int T,R,m,n,tot;int cal(ll x,ll y,ll z){ll ans=1;while(y){if(y&1) ans=ans*x%z;x=x*x%z;y>>=1;}return ans;}void get_pri(){fac[1]=1;for(int i=2; i<=P; i++) fac[i]=(ll)fac[i-1]*i%R;for(int i=2; i<=P; i++){    if(!prime[i]) pri[++tot]=i;    for(int j=1; i*pri[j]<=P; j++)    {    prime[i*pri[j]]=1;    if(i%pri[j]==0) break;    }}ans[1]=1;for(int i=2; i<=P; i++){ans[i]=ans[i-1];if(!prime[i]) ans[i]=(ll)ans[i]*(i-1)%R*cal(i,R-2,R)%R;}}    int main(){scanf("%d%d",&T,&R);get_pri();while(T--){scanf("%d%d",&n,&m);printf("%lld\n",(ll)fac[n]*ans[m]%R);}return 0;}


0 0
原创粉丝点击