POJ

来源:互联网 发布:2013年总决赛韦德数据 编辑:程序博客网 时间:2024/06/05 20:11

题目:给你一个数L,找出它的一个倍数x,使得x*L的每一位都是8,输出最小x*L的位数,不存在则输出0

思路:8*(10^k-1)/9=x*L

令r=gcd(8,L),化简

8/r*(10^k-1)=x*(9*L)/r,

因为gcd(8/r,9*L/r)=1,

所以10^k-1=0%(9*L/r)

10^k=1%(9*L/r)

由欧拉函数可以得知有解的条件为gcd(10,9*L/r)=1,然后枚举9*L/r的欧拉函数值的因子,满足条件的最小的因子就是答案

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<algorithm>#include<ctime>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<vector>#include<map>#include<set>#include<queue>#include<stack>#include<list>#include<numeric>using namespace std;#define LL long long#define ULL unsigned long long#define INF 0x3f3f3f3f3f3f3f3f#define mm(a,b) memset(a,b,sizeof(a))#define PP puts("*********************");template<class T> T f_abs(T a){ return a > 0 ? a : -a; }template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}// 0x3f3f3f3f3f3f3f3fconst int maxn=2e5+50;bool isprime[maxn];int prime[maxn],tol;void make_prime(int n){    for(int i=0;i<=n;i++)        isprime[i]=true;    isprime[0]=isprime[1]=false;    tol=0;    for(int i=2;i<=n;i++){        if(isprime[i])            prime[tol++]=i;        for(int j=0;j<tol;j++){            if(i*prime[j]<=n)                isprime[i*prime[j]]=false;            else                break;            if(i%prime[j]==0)                break;        }    }}LL phi(LL n){    LL res=n;    LL lim=n;    for(int i=0;i<tol&&(LL)prime[i]*prime[i]<=lim;i++)        if(n%prime[i]==0){            res=res-res/prime[i];            while(n%prime[i]==0){                n/=prime[i];            }        }    if(n>1)        res=res-res/n;    return res;}LL fac[maxn],num[maxn],cnt;void getfac(LL n){    LL lim=n;    cnt=0;    for(int i=0;i<tol&&(LL)prime[i]*prime[i]<=lim;i++){        if(n%prime[i]==0){            fac[cnt]=prime[i];            num[cnt]=0;            while(n%prime[i]==0){                num[cnt]++;                n/=prime[i];            }            cnt++;        }    }    if(n>1){        fac[cnt]=n;        num[cnt++]=1;    }}vector<LL> ans;void dfs(int i,LL x){    if(i==cnt){        ans.push_back(x);        return;    }    for(int j=0;j<=num[i];j++){        dfs(i+1,x);        x=x*fac[i];    }}LL mul_mod(LL a,LL b,LL MOD){    a%=MOD;    b%=MOD;    LL res=0;    while(b){        if(b&1){            res+=a;            if(res>=MOD) res-=MOD;        }        a=a*2;        if(a>=MOD) a-=MOD;        b=b/2;    }    return res;}LL pow_mod(LL a,LL b,LL MOD){    LL res=1;    while(b){        if(b&1){            res=mul_mod(res,a,MOD);        }        a=mul_mod(a,a,MOD);        b=b/2;    }    return res;}int main(){    int cas=0;    LL L;    make_prime(maxn-5);    while(~scanf("%lld",&L)){        if(L==0)            break;        LL r=gcd((LL)8,L);        LL MOD=(LL)9*L/r;        if(gcd((LL)10,MOD)==1){            LL x=phi(MOD);            getfac(x);//            printf("MOD=%lld %lld\n",MOD,x);//            for(int i=0;i<cnt;i++)//                printf("%lld %lld\n",fac[i],num[i]);            ans.clear();            dfs(0,1);            sort(ans.begin(),ans.end());//            for(int i=0;i<ans.size();i++){//                printf("%lld ",ans[i]);//            }//            printf("\n");//            printf("%lld\n",pow_mod((LL)10,(LL)1,MOD));            for(int i=0;i<ans.size();i++){                if(pow_mod((LL)10,ans[i],MOD)==1){                    printf("Case %d: %lld\n",++cas,ans[i]);                    break;                }            }        }        else            printf("Case %d: 0\n",++cas);    }    return 0;}


原创粉丝点击