题目链接:http://poj.org/problem?id=3696
题意:给出一个数字n,是否存在一个只有8组成的长度为k的数字P使得P是n的倍数。求最小的k。
思路:
i64 n;
vector<i64> split(i64 n)
{
vector<i64> ans;
i64 i;
for(i=1;i*i<=n;i++) if(n%i==0)
{
ans.pb(i);
if(i*i!=n) ans.pb(n/i);
}
return ans;
}
i64 mul(i64 a,i64 b,i64 mod)
{
i64 ans=0;
while(b)
{
if(b&1) ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return ans;
}
i64 Pow(i64 a,i64 b,i64 mod)
{
i64 ans=1;
while(b)
{
if(b&1) ans=mul(ans,a,mod);
a=mul(a,a,mod);
b>>=1;
}
return ans;
}
int main()
{
int num=0;
while(scanf("%lld",&n)!=-1&&n)
{
printf("Case %d: ",++num);
n*=9;
i64 p=8;
i64 x=Gcd(p,n);
p/=x;
n/=x;
if(Gcd(10,n)!=1) puts("0");
else
{
i64 t=eular(n);
vector<i64> factor=split(t);
sort(factor.begin(),factor.end());
int i;
FOR0(i,SZ(factor)) if(Pow(10,factor[i],n)==1) break;
PR(factor[i]);
}
}
}