该题要处理好一些细节。
#include<stdio.h>
#include<math.h>
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
int phi(int a){
int l=sqrt((double)a),ans=a;
for(int i=2;i<=l;i++)
if(a%i==0){
ans=ans/i*(i-1);
do
{
a=a/i;
}while(a%i==0);
}
if(a>1)ans=ans/a*(a-1);
return ans;
}
void get(int q,int &site,int &l){
site=0,l=q;
while(l%2==0){
site++;
l/=2;
}
}
int pow(int a,int b,int m){
int ans=1;
while(b){
if(b&1)
ans=(long long)ans*a%m;//long long 防止溢出
b>>=1;
a=(long long)a*a%m;
}
return ans;
}
int find(int b,int m){
int min=m;
for(int i=1;i*i<=m;i++)
if(m%i==0){
if(pow(2,i,b)==1)
return i;
if(pow(2,m/i,b)==1&&m/i<min)
min=m/i;
}
return min;
}
int main()
{
int k=1;
int p,q,site,len,b;
while(~scanf("%d/%d",&p,&q)){
if(p==0){
printf("Case #%d: 1,1\n",k++);
continue;
}
int d=gcd(p,q);
p/=d;q/=d;
get(q,site,b);
int ph=phi(b);
int len=find(b,ph);
site++;
printf("Case #%d: %d,%d\n",k++,site,len);
}
return 0;
}