-
#include<iostream> #include<cstdlib> #include<cstdio> using namespace std; typedef long long LL; LL pow(LL a,LL p,LL m){ LL d=1,t=a; while(p>0){ if(p&1==1){ d=(d*t)%m; } t=(t*t)%m; p=p>>1; } return d; } int enlerFun(int n){ int count = n; for(int i=2;i<=n;i++){ if(n%i==0){ count=count-count/i; while(n%i==0){n=n/i;} } } return count; } LL gcd(LL a,LL b){ return b==0?a : gcd(b,a%b); } int main() { int t=0; LL p,q,d,time,yue,minyue; //minyue最小的能使公式成立的约数 while( ~ scanf("%I64d/%I64d",&p,&q) ){ d=gcd(p,q);p/=d;q/=d; //化简分子和分母 //printf("%I64d %I64d",p,q); time=1; while( (q&1)==0 ){ //注意添加括弧 time++; q=q>>1; } //time就是起始位置3088601 yue=enlerFun(q); minyue=yue; //printf("%d\n",minyue); for(int i=1;i*i<=yue;i++){ if(yue%i==0){ if(pow(2,i,q)==1 && i<minyue){minyue=i;} //符合公式,大擂台找最小 if(pow(2,yue/i,q)==1 && (yue/i)<minyue){minyue=(yue/i);} } //printf("***%d\n",minyue); } printf("Case #%d: %d,",++t,time); printf("%d\n",minyue); }//while return 0; }
poj3358
最新推荐文章于 2019-10-12 23:47:56 发布