8是中国的幸运数字,如果一个数字的每一位都由8构成则该数字被称作是幸运数字。
现在给定一个正整数L,请问至少多少个8连在一起组成的正整数(即最小幸运数字)是L的倍数。
输入格式
输入包含多组测试用例。
每组测试用例占一行,包含一个整数L。
当输入用例L=0时,表示输入终止,该用例无需处理。
输出格式
每组测试用例输出结果占一行。
结果为“Case 1: ”+一个整数N,N代表满足条件的最小幸运数字的位数。
如果满足条件的幸运数字不存在,则N=0。
数据范围
1≤L≤2∗109
输入样例:
8
11
16
0
输出样例:
Case 1: 1
Case 2: 2
Case 3: 0
解析:
8888…8888 假设有x个8
那么可以分解成 8*(11…111) x个1
再分解 8*(10x-1)/9
因为是L的倍数 ,所以 9L| 8*(10x-1)
8*(10x-1)≡0(mod 9L)
因为有常数8,所以我们可以化简模数
10x≡ 1(mod
9
l
g
c
d
(
l
,
8
)
\frac{9l}{gcd(l,8)}
gcd(l,8)9l)
令C=
9
l
g
c
d
(
l
,
8
)
\frac{9l}{gcd(l,8)}
gcd(l,8)9l
10x≡ 1(mod C)
想到欧拉定理
(a,n)是互质的
所以若(10,C)不互质则无解
题目又要求最小的满足的
所以我们对φ©分解因数
最终就是求φ©约数最小的满足
此题快速幂会爆long long 所以配合快速乘
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll l;
int k;
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 qmi(ll a,ll b,ll mod)
{
ll res=1;
while(b)
{
if(b&1) res=qmul(res,a,mod);
a=qmul(a,a,mod);
b>>=1;
}
return res;
}
ll get_eleur(ll n)
{
ll res=n;
for(int i=2;i<=n/i;i++)
{
if(n%i==0)
{
res=res/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1) res=res/n*(n-1);
return res;
}
int main()
{
while(scanf("%lld",&l)&&l)
{
cout<<"Case "<<++k<<":"<<" ";
ll c=9*l/__gcd(l,8*1ll);
ll phi=get_eleur(c);
cout<<c<<" "<<phi<<" "<<endl;
ll res=1e18;
if(c%2==0||c%5==0) res=0;
else
{
for(ll d=1;d*d<=phi;d++)
{
if(phi%d==0)
{
if(qmi(10,d,c)==1) res=min(res,d);
if(qmi(10,phi/d,c)==1 ) res=min(res,phi/d);
}
}
}
cout<<res<<endl;
}
}