题目大意:输入L(1<=L<=2*10^9)(输入为0时表示结束),幸运数是仅由8组成且是L的最小倍数的那一个数,输出幸运数的位数,若不存在输出0.
样例输入:
8
11
16
0
样例输出:
1
2
0
分析:
888
⋅
⋅
⋅
⋅
8
(
k
个
8
)
=
L
q
,
那
么
L
=
2
t
m
,
0
<
=
t
<
=
3
且
m
无
5
的
因
子
2
3
∗
111
⋅
⋅
⋅
⋅
1
(
k
个
1
)
=
2
t
m
2
3
−
t
∗
111
⋅
⋅
⋅
1
(
k
个
1
)
=
m
(
1
0
k
−
1
)
/
9
=
m
q
1
所
以
1
0
k
=
1
m
o
d
(
9
m
)
同
时
9
m
与
10
互
质
,
欧
拉
定
理
有
:
1
0
φ
(
9
m
)
=
1
m
o
d
(
9
m
)
要
求
最
小
的
k
,
就
有
k
∣
φ
(
9
m
)
888····8(k个8)=Lq, 那么L=2^tm, 0<=t<=3\\ 且m无5的因子\\ 2^3* 111····1(k个1)=2^tm \\ 2^{3-t}*111···1(k个1)=m\\ (10^k-1)/9=mq_1\\ 所以10^k=1 mod(9m)\\ 同时9m与10互质,欧拉定理有:10^{\varphi(9m)}=1mod(9m)\\ 要求最小的k,就有k|\varphi(9m)
888⋅⋅⋅⋅8(k个8)=Lq,那么L=2tm,0<=t<=3且m无5的因子23∗111⋅⋅⋅⋅1(k个1)=2tm23−t∗111⋅⋅⋅1(k个1)=m(10k−1)/9=mq1所以10k=1mod(9m)同时9m与10互质,欧拉定理有:10φ(9m)=1mod(9m)要求最小的k,就有k∣φ(9m)
自己照着上面的思路写的:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll mod(ll a,ll r,ll m) // a^rmod main
{
ll base =a;
ll sum=1;
while(r)
{
if(r&1)
sum=sum*base%m;
base=base*base%m;
r>>=1;
}
return sum;
}
ll get_phi(ll n)
{
ll m=sqrt(n+0.5);
ll ans=n;
for(int i=2;i<=m;i++) if(n%i==0)
{
ans=ans*(i-1)/i;
while(n%i==0) n/=i;
}
if(n>1) ans=ans*(n-1)/n;
return ans;
}
int main()
{
ll L;
while(cin>>L)
{
if(L==0)
break;
if(L%16==0|| L%5==0)
{
printf("0\n");
continue;
}
int cnt=0;
int flag=0;
while(L%2==0)
{
cnt++;
if(cnt>3)
{
flag=1;
printf("0\n");
break;
}
L/=2;
}
if(flag) continue;
ll phi=get_phi(9*L);
if(mod(10,phi,9*L )!=1)
{
printf("0\n");
continue;
}
else
{
int k;
for(k=1;k<=sqrt(phi+0.5);k++) if(phi%k==0)
{
if(mod(10,k,9*L)==1)
{
printf("%lld\n",k);
break;
}
}
if(k>sqrt(phi+0.5))printf("%lld\n",phi);
}
}
return 0;
}
书上写的:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll modular_power1(ll a, ll r,ll m) // a^r mod m
{
ll d=1,t=a;
while(r>0)
{
if( (r%2)==1) d=(d*t)%m;
r/=2;
t=t*t%m;
}
return d;
}
bool H_div(ll L, ll k) //判定10^k=1(mod 9*L)是否成立
{
ll m=9*L, num;
num=modular_power1(10,k,m);
if(num==1) return true;
else return false;
}
ll phi(ll n)
{
ll val=1, i, i_pow;
int i_exp;
for(int i=2;i<=n;i++)
{
i_exp=0;
i_pow=1;
while(n%i==0)
{
i_exp++;
n/=i;
i_pow*=i;
}
if(i_exp!=0) val *= i_pow-i_pow/i;
}
return val;
}
int main()
{
int ncase=0;
ll L, ph, k;
while(cin>>L)
{
if(L!=0)
{
ncase++;
cout<<"Case"<<ncase<<": ";
if(L%16==0|| L%5==0)
cout<<0<<endl;
else
{
while(L%2==0) L/=2;
ph=phi(L*9);
k=1;
while(1)
{
if(ph%k==0)
{
if(H_div(L,k))
{
cout<<k<<endl;
break;
}
}
k++;
}
}
}
else break;
}
return 0;
}