poj 3696 尤拉函式+快速冪+思維
阿新 • • 發佈:2018-12-16
//尤拉定理 #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; typedef long long LL; LL gcd(LL a,LL b) { return b==0?a:gcd(b,a%b); } LL ouler(LL n) { LL res=n; for(int i=2;(LL)i*i<=n;i++) { if(n==1) break; if(n%(LL)i==0) { //先除後乘避免溢位 res/=(LL)i; res*=((LL)i-1); while(n%(LL)i==0) { n/=(LL)i; } } } if(n!=1) { res/=1l*n; res*=((LL)n-1); } return res; } LL mul(LL a,LL b,LL m) { LL ret=0; while(b) { if(b&1) ret=(ret+a)%m; b>>=1; a=(a<<1)%m; } return ret%m; } LL pow_mod(LL a,LL b,LL m) { LL res=1; while(b) { if(b&1) res=mul(res,a,m); b>>=1; a=mul(a,a,m); } return res%m; } int main() { LL n; int kase=0; while(scanf("%lld",&n)==1) { if(n==0) break; printf("Case %d: ",++kase); if(n==1) { printf("1\n"); continue; } LL m=n/gcd(n,8)*1l*9; if(gcd(10,m)==1) { //尤拉定理 LL k=ouler(m); LL solve=k; for(int i=1;(LL)i*i<=k;i++) { if(k%i==0) { if(pow_mod(10,1l*i,1l*m)==1) { solve=min((LL)i,solve); } if(pow_mod(10,1l*k/(LL)i,1l*m)==1) { solve=min(1l*k/(LL)i,solve); } } } printf("%lld\n",solve); } else { printf("0\n"); } } return 0; }