说实话这道题对着别人的题解做都做了好久......
进入正题:
由8组成的数可以表示为
=L*k(k=1,2,3,4,.........) ;
令p=8/gcd(L,8);q=9*L/(gcd(L,8));
由于p,q互质(自己想一下,实在不行带几个数字看看);
则:
所以只有 才满足等式;%q=0;
1(modq);
由欧拉定理可知当gcd(10,q)=1时才有解;
在有解下试除x=的素因子既能得到最小解;
扫描二维码关注公众号,回复:
3023085 查看本文章
注意:直接用快速幂可能会爆long long
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define PI acos(-1)
typedef long long ll;
using namespace std;
const int INF = 0x3f3f3f3f;
const ll N=1000;
ll phi_prime[N];
ll Gcd(ll a,ll b)
{
if(b==0)return a;
else return Gcd(b,a%b);
}
ll getphi(ll n)
{
ll t=n;
for(ll i=2;i*i<=n;i++)
{
if(n%i==0)
{
t=t-t/i;
while(n%i==0)n=n/i;
}
}
if(n!=1)t=t-t/n;
return t;
}
ll mul(ll a,ll b,ll mod)
{
a%=mod,b%=mod;
ll s=a,sum=0;
while(b)
{
if (b&1)
{
sum+=s;
if (sum>=mod) sum-=mod;
}
b>>=1;
s<<=1;
if (s>=mod) s-=mod;
}
return sum;
}
ll Pow(ll x,ll n,ll mod)
{
x=x%mod;
ll result=1;
while(n>0)
{
if(n&1)result=mul(result,x,mod);
x=mul(x,x,mod);
n=n>>1;
}
return result;
}
ll get_phi_prime(ll phi)
{
ll num=0;
for(ll i=2;i*i<=phi;i++)
{
if(phi%i==0)
{
phi_prime[num++]=i;
while(phi%i==0)phi=phi/i;
}
}
if(phi!=1)phi_prime[num++]=phi;
return num;
}
ll solve(ll phi,ll q)
{
ll num=get_phi_prime(phi);
for(ll i=0;i<num;i++)
{
while(1)
{
phi=phi/phi_prime[i];
if (Pow(10,phi,q)!=1)
{
phi=phi*phi_prime[i];
break;
}
else if (phi%phi_prime[i]) break;
}
}
printf("%lld\n",phi);
}
int main()
{
ll n,gcd,q,p;
ll cas=0;
while(~scanf("%lld",&n))
{
cas++;
if(n==0)break;
printf("Case %lld: ",cas);
gcd=Gcd(n,8);
p=8/gcd,q=n*9/gcd;
if(Gcd(10,q)!=1)
{
printf("0\n");
continue;
}
solve(getphi(q),q);
}
}