zoukankan      html  css  js  c++  java
  • poj3696

    4794: The Luckiest Number

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 48  Solved: 8
    [Submit][Status][Web Board]

    Description

    Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his own 
    lucky number L. Now he wants to construct his luckiest number which is the minimum among all positiv
    e integers that are a multiple of L and consist of only digit '8'.?
    找到一个最小的只含有数字8的十进制正整数,使它为L的倍数,输出其长度

    Input

    The input consists of multiple test cases. Each test case contains exactly one line containing L(1 
    ≤ L ≤ 10^12).The last test case is followed by a line containing a zero.

    Output

    For each test case, print a line containing the test case number( beginning with 1) 
    followed by a integer which is the length of Bob's luckiest number. 
    If Bob can't construct his luckiest number, print a zero.

    Sample Input

    8
    11
    16
    0

    Sample Output

    Case 1: 1
    Case 2: 2
    Case 3: 0

    由x个n组成的数可以写成n(10^x-1)/9
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    typedef long long ll;
    
    ll gcd(ll a,ll b){
       return b?gcd(b,a%b):a;
    }
    
    ll getphi(ll n){
       ll ans=n;
       for (ll i=2;i*i<=n;i++){
        if(n%i==0){
            ans=ans/i*(i-1);
            while(n%i==0) n/=i;
        }
       }
       if(n>1) ans=ans*(n-1)/n;
       return ans;
    }
    
    ll quickmod(ll a,ll b,ll p){
        ll ans=1%p;
        for (;b;b>>=1){
            if(b&1) ans=ans*a%p;
            a=a*a%p;
        }
        return ans;
    }
    
    int main(){
        ll l;
        ll t=0;
        while(scanf("%lld",&l)&&l!=0){
            ++t;
            ll ans=999999999999;
            ll d=gcd(l,8);
            ll k=9*l/d;
            ll phi=getphi(k);
            if(gcd(k*9/gcd(k,8),10)!=1)
            {
                printf("Case %lld: 0
    ",t);
                continue;
            }
            for (ll i=1;i*i<=phi;i++){
                if(phi%i==0){
                if(quickmod(10,i,k)==1%k) ans=min(ans,i);
                else if(quickmod(10,phi/i,k)==1%k) ans=min(ans,phi/i);
                }
            }
            if(ans==999999999999) printf("Case %lld: 0
    ",t);
            else printf("Case %lld: %lld
    ",t,ans);
        }
    return 0;
    }
  • 相关阅读:
    怎样使用jlink一键烧录整个flash Hi3518 a c e Hi3515 Hi3512
    阅读zepto.js的core中的Core methods
    linux下执行strlwr函数出错:ld returned 1 exit status
    POJ 3286 How many 0&#39;s?
    As long as Binbin loves Sangsang
    docker 的安装
    浅析JAVA设计模式之工厂模式(一)
    怎样在屏幕上显示多个alv
    链表的应用:单元多项式的加法、减法、乘法
    Android 开发中 iBeacon的使用
  • 原文地址:https://www.cnblogs.com/lmjer/p/9095583.html
Copyright © 2011-2022 走看看