表示还没理解过程,先贴个模版吧,套用在十进制下的求分数化小数的循环节答案不对。
#include <iostream> #include<cstdio> using namespace std; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int euler(int n) { int phi=n; int top=n; for(int i=2;i*i<=top;i++) { if(n%i==0) { phi=phi/i*(i-1); while(n%i==0) n/=i; } } if(n>1) phi=phi/n*(n-1); return phi; } int pow_mod(__int64 a,__int64 b,__int64 n) { __int64 t=1; a%=n; while(b) { if(b&1) t=t*a%n; a=a*a%n; b>>=1; } return t; } int main() { int n,m,d,t,ans1,ans2,phi,i,Case=0; char ch; while(~scanf("%d%c%d",&n,&ch,&m)) { Case++; d=gcd(n,m); n/=d;m/=d;t=0; while(m%2==0) t++,m>>=1; ans1=t+1; phi=euler(m); ans2=phi; for(i=2;i*i<phi;i++) { if(phi%i) continue; d=pow_mod(2,i,m); if(d==1 && ans2>i) ans2=i; d=pow_mod(2,phi/i,m); if(d==1 && ans2>phi/i) ans2=phi/i; } printf("Case #%d: %d,%d ",Case,ans1,ans2); } return 0; }