【POJ3696】The Luckiest Number-欧拉定理+快速幂
测试地址:The Luckiest Number
题目大意:给出一个正整数
做法:这题的思路很神……没看题解的时候根本不知道怎么做,调也调了好一会,我好弱啊……
这一题需要使用欧拉定理+快速幂来解决。
我们发现
1.求出
2.令
3.对所有质因子进行以上操作后,最后的
那么无解的情况呢?显然可知,如果
犯二的地方:试除法忘记探测最后剩余是不是1了,导致可能漏掉一个质因子,以后要注意……
以下是本人代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
ll L,fac[1010]={0};
ll gcd(ll a,ll b)
{
return (b==0)?a:gcd(b,a%b);
}
ll phi(ll x)
{
ll p=x,s=x;
for(ll i=2;i*i<=s;i++)
if (!(x%i))
{
p=p/i*(i-1);
while(!(x%i)) x/=i;
}
if (x>1) p=p/x*(x-1);
return p;
}
void find_factor(ll x)
{
ll s=x;
fac[0]=0;
for(ll i=2;i*i<=s;i++)
if (!(x%i))
{
fac[++fac[0]]=i;
while(!(x%i)) x/=i;
}
if (x>1) fac[++fac[0]]=x;
}
ll mult(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 power(ll a,ll b,ll mod)
{
ll s=a,sum=1;
while(b)
{
if (b&1) sum=mult(sum,s,mod);
b>>=1;s=mult(s,s,mod);
}
return sum;
}
int main()
{
int t=0;
while(scanf("%lld",&L)&&L)
{
t++;
ll m=L/gcd(L,8)*9,p=phi(m),x=p;
if (gcd(m,10)!=1) {printf("Case %d: 0\n",t);continue;}
find_factor(p);
for(int i=1;i<=fac[0];i++)
{
while(1)
{
x/=fac[i];
if (power(10,x,m)!=1)
{
x*=fac[i];
break;
}
else if (x%fac[i]) break;
}
}
printf("Case %d: %lld\n",t,x);
}
return 0;
}