给L,求L符合条件的最小倍数。条件是这个倍数每一位都是8。
要用快速乘,直接乘会爆long long。
除以gcd(l,8)是为了消去外面的8。
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define ms(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=1e6+10;
using namespace std;
LL gcd(LL a,LL b)
{
return b?gcd(b,a%b):a;
}
LL qmul(LL a,LL b,LL mod)
{
LL res=0;
while(b)
{
if(b&1) res=(res+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return res;
}
LL qpow(LL a,LL b,LL mod)
{
LL res=1;
while(b)
{
if(b&1)
res=qmul(res,a,mod)%mod;
a=qmul(a,a,mod)%mod;
b>>=1;
}
return res;
}
int main()
{
LL l,it=1;
while(cin>>l,l)
{
cout<<"Case "<<it++<<": ";
l=l/gcd(l,8);
l*=9;
if(gcd(10,l)!=1)
cout<<0<<endl;
else
{
LL phi=l,mod=l;
for(LL i=2;i*i<=l;i++)
{
if(l%i==0) phi=phi/i*(i-1);
while(l%i==0) l/=i;
}
if(l>1)
phi=phi/l*(l-1);
LL minn=phi;
for(LL i=1;i*i<=phi;i++)
{
if(phi%i==0)
if(qpow(10,i,mod)==1)
{
minn=i;
break;
}
else
if(qpow(10,phi/i,mod)==1)
minn=phi/i;
}
cout<<minn<<endl;
}
}
}