HDU 4335 What is N?
2014-05-26 17:36
429 查看
#include "iostream" #include "cstdio" #include "cmath" #include "algorithm" #include "map" #define LL unsigned __int64 using namespace std; //返回ab mod n LL mul_mod(LL a,LL b,LL c) { LL ret=0,tmp=a%c; while(b) { if(b&0x1)if((ret+=tmp)>=c)ret-=c; if((tmp<<=1)>=c)tmp-=c; b>>=1; } return ret; } //快速幂 LL pow_mod(LL a,LL p,LL n){ if(p==0) return 1%n; LL ans=pow_mod(a,p/2,n); ans=mul_mod(ans, ans, n); if(p%2==1) ans=mul_mod(ans, a, n); return ans%n; } //求单个数的欧拉函数值 LL euler_phi(LL n){ LL m=(int)sqrt(n+0.5); LL ans=n; for(int i=2;i<=m;i++) if(n%i==0){ ans=ans/i*(i-1); while (n%i==0) n/=i; } if(n>1) ans=ans/n*(n-1); return ans; } int main(){ int T; scanf("%d",&T); int kase=1; int b,p; LL m; while(T--){ //scanf("%d%d%llu",&b,&p,&m); cin>>b>>p>>m; b=b%p; LL phi=euler_phi(p); LL base=1; LL add=0; int flag; LL ans=0; for(int i=0;i<=p;i++){ base*= i? i:1; if(base>=phi) add=phi; base%=phi; if(!base) {flag=i;break;} if(i<=m&&pow_mod(i,base+add,p)==b) ans++; } for(int i=0;i<p&&i<=m;i++){ if(pow_mod(i,phi,p)==b){ ans+=(m-i)/p+1; if(flag>=i+1){ ans-=(flag-i-1)/p+1; } } } if(m==18446744073709551615LL&&p == 1&&b == 0) { printf("Case #%d: 18446744073709551616\n", kase++); } else printf("Case #%d: %I64u\n", kase++, ans); } return 0; }
相关文章推荐
- HDU-4335 What is N? 欧拉函数,欧拉定理
- HDU 4335 What is N?
- HDU - 4335 What is N? 欧拉函数
- 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 What is N? 数论
- HDU 4335 What is N? 多校4(数论)
- hdu - 4335 - What is N? - 数论
- What is N? HDU - 4335
- 数论 + 公式 - HDU 4335 What is N?
- hdu 4335 Party All the Time(三分求极值,3级)
- hdu 4335 Party All the Time(三分求极值,3级)
- HDU 4335 Contest 4