http://acm.hdu.edu.cn/showproblem.php?pid=1395
枚举x复杂度可以处理成O(n),由于我是个sb,所以给弄成O(nlogn)了。
这里用的方法基于欧拉定理。欧拉定理表明,若n,a为正整数,且n,a互质,(a,n) = 1,则a^φ(n) ≡ 1 (mod n)。
我们处理的当然是(2,n)=1的情况,枚举欧拉函数的因子即可
View Code
#include <stdio.h> __int64 qpow(int a,__int64 b,int r) { __int64 ans=1,buff=a; while(b) { if(b&1)ans=(ans*buff)%r; buff=(buff*buff)%r; b>>=1; } return ans; } __int64 Eular(__int64 n) { __int64 ret=n; for(int i=2;i*i<=n;i++) if(n%i==0) { ret-=ret/i; while(n%i==0)n/=i; if(n==1)break; } if(n!=1)ret-=ret/n; return ret; } int main() { __int64 n ; while(~scanf("%I64d",&n)) { if((n&1)==0 || n==1) printf("2^? mod %I64d = 1\n",n) ; else { __int64 temp=Eular(n) ; for(int i=2;;i++) if(temp%i==0 && qpow(2,i,n)==1) { printf("2^%d mod %I64d = 1\n",i,n) ; break ; } } } return 0 ; }