关闭

POJ 3696 The Luckiest Number 欧拉函数

标签: poj数论
205人阅读 评论(0) 收藏 举报
分类:
/*
    《数论及应用》P164
*/
#pragma warning(disable:4786)
#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#include<string>
#include<sstream>
#define LL long long
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define lson l,m,x<<1
#define rson m+1,r,x<<1|1
using namespace std;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double PI = acos(-1.0);
const double eps=1e-6;
LL gcd(LL a , LL b)
{
    return b == 0 ? a : gcd( b , a % b) ;
}
LL phi(LL n)
{
    LL ret = n ;
    for(LL i = 2 ; i * i <= n ; i++){
        if(n % i == 0){
            ret = ret / i * ( i - 1 ) ;
            while(n % i == 0){
                n /= i ;
            }
        }
    }
    if(n > 1)       ret = ret / n * (n - 1);
    return ret;
}
LL mul(LL a , LL b , LL mod)  //两个长整型相乘可能发生长整型溢出的现象
{
    LL n = 0;
    while(b){
        if(b & 1)
            n = (n + a) % mod;
        a = a * 2 % mod ;
        b >>= 1;
    }
    return n;
}
LL quick_mod(LL x , LL n , LL mod)
{
    if(n == 0)      return 1;
    LL res = quick_mod( mul(x , x , mod) , n / 2 , mod);
    if(n & 1)   res = mul( res , x , mod ) ;
    return res;
}
int main()
{
    LL L ;
    int kase = 0 ;
    while(scanf("%lld",&L)==1 && L){
        LL d = gcd( (LL)8 , L );
        L = (LL)9  * L / d ;
        if(gcd(L , (LL) 10) != 1){
            printf("Case %d: 0\n",++kase);
            continue;
        }
        LL P = phi( L ) , ans = P ;
        for(LL i = 1 ; i * i <=P ; i++){
            if( P % i == 0 ){
                LL res = quick_mod( (LL) 10 , i ,  L );
                if(res ==  1)
                    ans = min(ans , i);
                res = quick_mod( (LL) 10 ,  (P / i) , L );
                if(res ==  1)
                    ans = min(ans ,  P / i );
            }
        }
        printf("Case %d: %lld\n",++kase , ans);
    }
    return 0;
}

0
0
查看评论

POJ3696 The Luckiest number 欧拉函数应用

题目链接:http://poj.org/problem?id=3696 题目大意:对于给定的整数L,找出L能整除最短的全8序列的长度,做为Bob的幸运数字。 分析:我们设幸运数字是x,由题意可知,长度为x全8序列为:8/9 * (10^x-1)=L * p,即(10^x-1)=9...
  • AC_Gibson
  • AC_Gibson
  • 2015-07-21 09:38
  • 405

The Luckiest number POJ - 3696 (欧拉函数)

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 luck...
  • Coldfresh
  • Coldfresh
  • 2017-06-07 21:29
  • 103

poj 3696 The Luckiest number(欧拉函数)

poj 3696 The Luckiest number 由题有 8
  • fallenfall
  • fallenfall
  • 2014-08-02 17:21
  • 387

POJ 3696 The Luckiest number(欧拉函数)

 题意:给出一个数L,现在要求一个数A,使得L|A,并且A的每一位都是8,问A的最少位数是多少。 思路: 代码: #include #include #include #include #include #include #include #include #include #inc...
  • qian99
  • qian99
  • 2014-03-14 11:58
  • 803

POJ - 3696 The Luckiest number 欧拉函数

题目:给你一个数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*...
  • ACVector
  • ACVector
  • 2017-08-28 14:40
  • 53

POJ 3696 The Luckiest number(欧拉函数)

题意:给出一个数L,现在要求一个数A,使得L|A,并且A的每一位都是8,问A的最少位数是多少。 思路: 首先要把A转化一下,把A表示成,则(p是一个整数),令,那么就存在一个整数k使得,因此,就是求。同余方程有解的条件是(10,m)=1,简单证明:若(10,m)的素因子为2 ...
  • qian99
  • qian99
  • 2014-03-14 11:54
  • 757

POJ 3696 The Luckiest Number 欧拉函数

是否存在n能整除的m使m各位都是8。m=89(10x−1)=kn m=\frac{8}{9}(10^x-1) = kn 8⋅10x−1gcd(8,n)=9⋅kngcd(8,n) 8\cdot\frac{10^x-1}{\gcd(8,n)} = 9\cdot\frac{kn}{\gcd(8,n)} ...
  • huanghongxun
  • huanghongxun
  • 2016-03-23 21:17
  • 406

poj 3696 The Luckiest number

http://poj.org/problem?id=3696 这个题挺好,开始以为只要是素因子分解后2的幂次不超过3并且该数 / 2^x后这个数必须是11111111…… 的形式几个1就输出几,然后我脑残的写交了然后就脑残的wa 了……才发现11111……不一定都是素数。。。 正解是...
  • struggle_mind
  • struggle_mind
  • 2012-08-13 17:46
  • 328

POJ 3696 The Luckiest number 欧拉函数 或 BSGS

原题见POJ 3696给一个数L,问至少几个8(如88,8888,88888)可以整数L。若不能,就输出-1.首先把连续的x个8表示成8+8⋅10+8⋅102+...+8⋅10x−1=8(10x−1)10−18+8·10+8·10^2+...+8·10^{x-1}={8...
  • Danliwoo
  • Danliwoo
  • 2015-10-02 23:05
  • 539

POJ 3696 The Luckiest number

这是一道神题,不仅思路证明难,而且编码也难,花了我一天时间,各种证明,各种细节。 首先题目给出一个L,求出L的每位数字都是8的倍数,那么就可以列这么一个方程(10^x-1)*8/9==0mod L; 转化为(10^x-1)*8/9=kL==>(10^x-1)*8+9Lk=0; 此时设d=...
  • qq_33901573
  • qq_33901573
  • 2016-08-02 18:22
  • 273
    个人资料
    • 访问:25299次
    • 积分:1518
    • 等级:
    • 排名:千里之外
    • 原创:130篇
    • 转载:0篇
    • 译文:0篇
    • 评论:16条
    最新评论