题解:P10496 The Luckiest Number
有趣的数论题。
P10496 题解
题意简述
给定一个正整数
思路引导
我们先将
众所周知
然后有
我们将问题转化为了求解最小的
根据欧拉定理,
假设
由于
因此,只需要枚举
时间复杂度
代码
感觉自己代码写的算是比较清楚,就不写注释了,应该都看的懂的。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int L,MOD;
int phi(int x){
int res=x;
for(int i=2;i*i<=x;++i)
if(x%i==0){
res=res-res/i;
while(x%i==0)x/=i;
}
if(x!=1)return res-res/x;
else return res;
}
int qpow(int x,int y){
int res=1;
for(;y;y>>=1,x=(x*x)%MOD)if(y&1)res=res*x%MOD;
return res;
}
signed main(){
int L,id=0;
cin>>L;
while(L!=0){
id++;
int d=9ll*L/__gcd(L,8ll),p=phi(d),ans=1e9;
MOD=d;
for(int i=1;i*i<=p;++i){
if(p%i)continue;
if(qpow(10,i)==1)ans=min(ans,i);
if(qpow(10,p/i)==1)ans=min(ans,p/i);
}
if(ans>=1e9)ans=0;
cout<<"Case "<<id<<": "<<ans<<"\n";
cin>>L;
}
}