AcWing 202. 最幸运的数字
思路:
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int gcd(LL n,int m) {
return m?gcd(m,n%m):n;
}
LL get_euler(LL x) { //求欧拉函数
LL res=x;
for(int i=2;i<=x/i;i++) {
if(x%i==0) {
while(x%i==0) x/=i;
res=res/i*(i-1);
}
}
if(x>1) res=res/x*(x-1);
return res;
}
LL qmul(LL a,LL b,LL p) { //龟速乘
LL res=0;
while(b) {
if(b&1) res=(res+a)%p;
a=(a+a)%p;
b>>=1;
}
return res;
}
LL qpow(LL a,LL b,LL p) {
LL res=1;
while(b) {
if(b&1) res=qmul(res,a,p); //会爆long long,所以用龟速乘
a=qmul(a,a,p);
b>>=1;
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int _t=1;
LL L;
while(cin>>L,L) {
int d=gcd(L,8);
LL c=9*L/d;
LL phi=get_euler(c);
LL res=1e18;
if(c%2==0||c%5==0) res=0;//判断c与10是否互质(欧拉定理条件)
for(LL i=1;i<=phi/i;i++) {
if(phi%i==0) {
if(qpow(10,i,c)==1) res=min(res,i);
if(qpow(10,phi/i,c)==1) res=min(res,phi/i);
}
}
cout<<"Case "<<(_t++)<<": "<<res<<"\n";
}
return 0;
}