只能过第一个点;;
经检查发现代码 l 过大时会输出 0,但精度没有爆炸,因此本人找不到输出 0 的原因。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll read()
{
short f=1;ll x=0;char s=getchar();
while(s<48||s>57){f=s=='-'?-1:1;s=getchar();}
while(s>=48&&s<=57){x=x*10+s-48;s=getchar();}
return x*f;
}
ll pri[3005];int tot,t;
ll phi(ll n)
{
ll ans=n;
for(ll i=2;i<=n/i;++i)
if(ans%i==0)
{
ans=ans-ans/i;
while(n%i==0)n=n/i;
}
if(n>1)ans=ans-ans/n;
return ans;
}
__int128 ksm(__int128 x,ll y,ll p)
{
__int128 a=1;x=x%p;
while(y)
{
if(y&1)a=a*x%p;
x=x*x%p;y=y>>1;
}
return a;
}
int main()
{
ll l,nl;bool z;
while(l=read())
{
++t;tot=0;z=0;
l=l*9/__gcd(l,8ll);
nl=phi(l);
for(ll i=1;i<=nl/i;++i)
if(nl%i==0)
{
pri[++tot]=i;
if(nl/i!=i)pri[++tot]=nl/i;
}
sort(pri+1,pri+tot+1);
printf("Case %d: ",t);
for(int i=1;i<=tot;++i)
if(ksm(10,pri[i],l)==1)
{
printf("%lld\n",pri[i]);
z=1;break;
}
if(!z)puts("0");
}
return 0;
}