hdu 4335 What is N?
2013-07-22 17:14
309 查看
此题用到的公式:a^b%c=a^(b%phi(c)+phi(c))%c (b>=phi(c)).
1.当n!<phi(p)时,直接暴力掉;
2.当n!>=phi(p) && n!%phi(p)!=0,用上面公式求;
3.当n!>=phi(p) && n!%phi(p)==0,变为n^(phi(p))%p,找循环节,就可以了
View Code
1.当n!<phi(p)时,直接暴力掉;
2.当n!>=phi(p) && n!%phi(p)!=0,用上面公式求;
3.当n!>=phi(p) && n!%phi(p)==0,变为n^(phi(p))%p,找循环节,就可以了
#include<iostream> #include<stdio.h> #include<algorithm> #include<iomanip> #include<cmath> #include<string> #include<cstdlib> #include<vector> #define ll unsigned __int64 using namespace std; ll an[100001]; ll euler(ll n) { ll ans=1; for(int i=2;i*i<=n;i++) { if(n%i==0) { ans*=i-1; n/=i; while(n%i==0) { ans*=i; n/=i; } } } if(n>1) ans*=n-1; return ans; } ll pows(ll a,ll b, ll mod) { ll ans=1; while(b) { if(b&1) ans=(ans*a)%mod; b>>=1; a=(a*a)%mod; } return ans%mod; } int main() { int t,k=0; ll m,ans,fac,c,i,j,phi,b,p; cin>>t; while(t--) { scanf("%I64u%I64u%I64u",&b,&p,&m); printf("Case #%d: ",++k); if(p==1) { if(m==18446744073709551615U) printf("18446744073709551616\n"); else printf("%I64u\n",m+1); continue; } ans=0;fac=1; phi=euler(p); //n!<phi(p) for(i=0;i<=m&&fac<=phi;i++) { if(pows(i,fac,p)==b) ans++; fac*=(i+1); } fac%=phi; //n!>=phi(p) && n!%phi(p)!=0 for(;i<=m&&fac;i++) { if(pows(i,fac+phi,p)==b) ans++; fac=(fac*(i+1))%phi; } //n!>=phi(p) && n!%phi(p)==0 if(i<=m) { ll cnt=0; // memset(an,0,sizeof(an)); for(j=0;j<p;j++) { an[j]=pows(i+j,phi,p); if(an[j]==b) cnt++; } c=(m-i+1)/p; ans+=c*cnt; ll remind=(m-i+1)%p; for(j=0;j<remind;j++) if(an[j]==b) ans++; } printf("%I64u\n",ans); } return 0; }
View Code
相关文章推荐
- hdu 4335 What is N? 数论
- Hdu 4335 What is N? 欧拉函数降幂公式 + 循环节
- HDU 4335 What is N? 简单数论
- [代码]HDU 4335 What is N?
- HDU 4335 What is N? 多校4(数论)
- HDU 4335 What is N?
- hdu - 4335 - What is N? - 数论
- What is N? HDU - 4335
- HDU 4335What is N?2012多校联赛第四场(欧拉函数+坑数据)
- 数论 + 公式 - HDU 4335 What is N?
- HDU 4335 What is N?
- hdu 4335 What is N?
- HDU 4335 What is N?
- HDU-4335 What is N? 欧拉函数,欧拉定理
- 数论 + 公式 - HDU 4335 What is N?
- HDU - 4335 What is N? 欧拉函数
- HDU - 4335 What is N? 欧拉函数
- hdu 4335 Party All the Time(三分求极值,3级)
- hdu 4335 A^x = A^(x % Phi(C) + Phi(C)) (mod C)(x>=phi(c))
- [高数 ] hdu 4335 Party All the Time