您的位置:首页 > 其它

The Luckiest number(hdu 2462)

2017-03-07 22:32 239 查看
给定一个数,判断是否存在一个全由8组成的数为这个数的倍数

若存在则输出这个数的长度,否则输出0

/*
个人感觉很神的一道题目。
如果有解的话,会有一个p满足:(10^x-1)/9*8=L*p
=> 10^x-1=9*L*p/8
设m=9*L/gcd(L,8)
则存在p1使得 10^x-1=m*p1
=> 10^x=1(mod m)
根据欧拉定理 10^φ(m)=1(mod m)
所以x一定是φ(m)的因数(这好像是某个定理)。
*/
#include<iostream>
#include<cstdio>
#define lon long long
#define N 400010
#ifdef unix
#define LL "%lld"
#else
#define LL "%I64d"
#endif
using namespace std;
int prime
,f
,num,qlen;
lon q
;
void get_prime(){
for(int i=2;i<N;i++){
if(!f[i]) prime[++num]=i;
for(int j=1;j<=num;j++){
if(i*prime[j]>=N) break;
f[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
lon gcd(lon a,lon b){
if(!b) return a;
return gcd(b,a%b);
}
lon euler(lon x){
lon res=x;
for(lon i=2;i*i<=x;i++)
if(x%i==0){
res-=res/i;
while(x%i==0) x/=i;
}
if(x>1) res-=res/x;
return res;
}
void get_q(lon n){
qlen=0;
for(int i=1;i<=num&&n>1;i++){
while(n%(lon)prime[i]==0){
n/=prime[i];
q[++qlen]=prime[i];
}
}
if(n>1) q[++qlen]=n;
}
lon mul(lon a,lon b,lon mod){
lon base=a,r=0;
while(b){
if(b&1) r+=base;r%=mod;
base+=base;base%=mod;
b>>=1;
}
return r;
}
lon poww(lon a,lon b,lon mod){
lon base=a,r=1;
while(b){
if(b&1) r=mul(r,base,mod);
base=mul(base,base,mod);
b>>=1;
}
return r;
}
int main(){
int cas=0;lon L;get_prime();
while(scanf(LL,&L)&&L){
lon m=9*L/gcd(L,8);
if(gcd(m,10)>1){
printf("Case %d: 0\n",++cas);
continue;
}
lon x=euler(m);get_q(x);
for(int i=1;i<=qlen;i++){
if(poww(10,x/q[i],m)==1){
x/=q[i];
}
}
printf("Case %d: ",++cas);
printf(LL,x);printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: