[数论杂题] BZOJ1951: [Sdoi2010]古代猪文
2017-11-28 20:36
316 查看
为了数论而数论的题…..没什么技术含量…
就是求:
G∑i|n(ni)%P=G(∑i|n(ni)%ϕ(P))%P
现在需要求 (∑i|n(ni))%M,其中 M=ϕ(P)=P−1=999911658=2∗3∗4679∗35617
n比较大,想到 Lucas ,但模数 M 不是质数。实际上只要分解成质数,然后 Lucas 之后用中国剩余定理合并即可。
就是求:
G∑i|n(ni)%P=G(∑i|n(ni)%ϕ(P))%P
现在需要求 (∑i|n(ni))%M,其中 M=ϕ(P)=P−1=999911658=2∗3∗4679∗35617
n比较大,想到 Lucas ,但模数 M 不是质数。实际上只要分解成质数,然后 Lucas 之后用中国剩余定理合并即可。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const LL maxn=40005, P=999911659, M=P-1; //\phi(p) = M = 2 * 3 * 4679 * 35617 LL n,G,a[8],m[8],fac[maxn],inv[maxn],fac_inv[maxn],res; LL Pow(LL a,LL b,LL MOD){ LL res=1; a%=MOD; for(;b;b>>=1,a=a*a%MOD) if(b&1) res=(res*a)%MOD; return res; } LL C(LL n,LL m,LL MOD){ if(n<MOD&&m<MOD) return n<m?0:fac *fac_inv[m]%MOD*fac_inv[n-m]%MOD; return C(n%MOD,m%MOD,MOD)*C(n/MOD,m/MOD,MOD)%MOD; } int main(){ freopen("bzoj1951.in","r",stdin); freopen("bzoj1951.out","w",stdout); scanf("%lld%lld",&n,&G); G%=P; if(G==0) return printf("0\n"),0; m[1]=2,m[2]=3,m[3]=4679,m[4]=35617; for(int k=1;k<=4;k++){ fac[0]=1; for(int i=1;i<=m[k]+5;i++) fac[i]=fac[i-1]*i%m[k]; inv[1]=1; for(int i=2;i<=m[k]+5;i++) inv[i]=(LL)(m[k]-m[k]/i)*inv[m[k]%i]%m[k]; fac_inv[0]=1; for(int i=1;i<=m[k]+5;i++) fac_inv[i]=fac_inv[i-1]*inv[i]%m[k]; for(LL i=1;i*i<=n;i++) if(n%i==0){ (a[k]+=C(n,i,m[k]))%=m[k]; if(i*i!=n) (a[k]+=C(n,n/i,m[k]))%=m[k]; } (res+=a[k]*(M/m[k])%M*Pow(M/m[k],m[k]-2,m[k])%M)%=M; } printf("%lld\n",Pow(G,res,P)); return 0; }
相关文章推荐
- bzoj1951 [Sdoi2010]古代猪文
- BZOJ 1951: [Sdoi2010]古代猪文
- BZOJ 1951 [Sdoi2010] 古代猪文 数论 Lucas定理
- 【BZOJ 1951】 [Sdoi2010]古代猪文|数论|中国剩余定理|Lucas
- bzoj 1951: [Sdoi2010]古代猪文
- [bzoj1951][SDOI2010]古代猪文
- 【BZOJ】1951[Sdoi2010]古代猪文
- BZOJ1951: [Sdoi2010]古代猪文
- BZOJ 1951 【SDOI2010】 古代猪文
- [bzoj1951][Sdoi2010]古代猪文
- bzoj 1951: [Sdoi2010]古代猪文
- [bzoj1951][SDOI2010]古代猪文
- bzoj1951 [Sdoi2010]古代猪文
- 【BZOJ1951】【SDOI2010】古代猪文
- bzoj 1951 [Sdoi2010]古代猪文(数论知识)
- Bzoj1951: [Sdoi2010]古代猪文
- BZOJ 1951: [Sdoi2010]古代猪文 (数论各种定理)
- Bzoj1951 [Sdoi2010]古代猪文
- 【bzoj1951】[Sdoi2010]古代猪文 费马小定理+Lucas定理+中国剩余定理
- BZOJ 1951 SDOI2010 古代猪文 数论 Lucas定理