[题解](同余)POJ_3696_The Luckiest Number

还是挺难的吧......勉强看懂调了半天

首先表达式可以写成 8(10^x -1)/9,题意为求一个最小的x使L | 8(10^x -1)/9

设d=gcd(L,8)

L | 8(10^x -1)/9

<=>9L | 8(10^x -1)

<=>9L/d | 10^x -1 (因为 9L/d 和 8/d 互质了 所以 9L/d 能整除(8/d)*(10^x-1)和 8/d 无关,所以可以去掉)

<=>10^x 同余 1(mod 9L/d)

引理:

若a,n互质,则满足10^x同余1(mod n)的最小正整数x0是phi(n)的约数

反证法:

假设满足a^x 同余 1(mod n)的最小正整数x0不能整除phi(n)

设phi(n)=q*x0+r(0<r<x0),因为a^x0 同余1(mod n),所以a^(q*x0)同余1(mod n)

根据欧拉定理a^phi(n)同余1(mod n),所以a^r同余1(mod n),与x0最小矛盾

无解的时候就是q与10不互质的时候,因为若q与10有公因子d:
1.若d=2,q=2*k,那么10^x=2^x*5^x=1%2k
   即2^x*5^x=1+2k*m,左边为偶数,右边为奇数,显然矛盾。
2.若d=5,q=5*k,那么10^x=2^x*5^x=1%5k
   即2^x*5^x=1+5k*m,左边是5的倍数,右边不是5的倍数,显然矛盾。

注意:乘的时候会爆longlong,手写乘法,要用根号的试除法求约数,不然会T

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
ll n,cnt;
ll x[100000];
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll eular(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*(n-1);
    return ans;
}
ll mul(ll a,ll b,ll mod){
    ll ans=0;
    while(b){
        if(b&1)ans=(ans+a)%mod;
        a=(a<<1)%mod;
        b>>=1;
    }
    return ans;
}
ll qpow(ll a,ll b,ll mod){
    ll base=a,ans=1;
    while(b){
        if(b&1)ans=mul(ans,base,mod);
        base=mul(base,base,mod);
        b>>=1;
    }
    return ans%mod;
}

int main(){
    int t=0;
    while(1){
        int fl=0;cnt=0;
        scanf("%lld",&n);
        if(n==0)break;
        ll d=9*n/gcd(n,8);
        if(gcd(10,d)!=1){
            printf("Case %d: 0\n",++t);
        }
        else{
            ll phi=eular(d);
            for(ll i=1;i*i<=phi;i++){
                if(phi%i==0){
                    x[++cnt]=i;
                    if(i*i!=phi)x[++cnt]=phi/i;
                }
            }

            sort(x+1,x+cnt+1);
            for(int i=1;i<=cnt;i++)
            if(qpow(10,x[i],d)==1){
                printf("Case %d: %lld\n",++t,x[i]);
                break;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/superminivan/p/10863420.html

时间: 2024-10-09 08:52:32

[题解](同余)POJ_3696_The Luckiest Number的相关文章

poj_3696_The Luckiest number

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 positive integers that are a multiple of L and consist of

POJ3696 The Luckiest Number

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 positive integers that are a multiple of L and consist of

The Luckiest number(hdu2462)

The Luckiest number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1163    Accepted Submission(s): 363 Problem Description Chinese people think of '8' as the lucky digit. Bob also likes digit '

POJ_3696 The Luckiest number 【欧拉定理+同余式+对取模的理解】

一.题目 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 positive integers that are a multiple of L and consi

poj-3696 The Luckiest number

题意: 给出一个数L,求一个最小的x,使长度为x的888...8这个数整除L: 无解输出0,L<=2*10^9: 题解: 即求满足下式的最小x值: 8/9*(10^x-1)==k*L         (k为正整数) 8*(10^x-1)==k*9*L 为继续化简,求出r=gcd(L,8): 8/r *(10^x-1)==k*9*L/r 因为8/r与9*L/r互质,9*L这个因式必在(10^x-1)中,所以原式即为: 10^x-1≡0(mod 9*L/r) 10^x≡1(mod 9*L/r) 设q

poj The Luckiest number

                                     The Luckiest numbe 题目: 在满足|x| + |y|最小时候,让a*|x| + b*|y|最小.求:|x| + |y|最小值. 算法: 同余式的求解运用. 解体步骤: 1.先用gcd判断是否有解.(c%g == 0有解) 2.对式子求最简式.a' = a/g ; b' = b/g: c' = c/g; 3.运用扩展欧几里得求解x,y的值. 4.判断当x,y分别求得最小正整数解时候的大小. 5.确定最后答案

「POJ3696」The Luckiest number【数论,欧拉函数】

# 题解 一道数论欧拉函数和欧拉定理的入门好题. 虽然我提交的时候POJ炸掉了,但是在hdu里面A掉了,应该是一样的吧. 首先我们需要求的这个数一定可以表示成\(\frac{(10^x-1)}{9}\times 8\). 那么可以列出一个下面的方程 \[\frac{(10^x-1)}{9}\times 8=L\times k\] 设\(d=gcd(9L,8)=gcd(L,8)\) \[\frac89(10^x-1)=Lk\] \[\frac{8(10^x-1)}d=\frac{9Lk}{d}\]

$题解 CF110A 【Nearly Lucky Number】$

$ CF110A ? Nearly ?Lucky ?Number$ 还是一道比较不错的题目,可以拿来练练手\((QAQ)\). 题目中虽说\(n\)在\(long \ long\)范围内,但不知为什么,我一看到要分解数字就想用字符串做. 输入就不说了-- 因为要判断\(n\)是否为"类幸运数字",所以,我们可以开一个自定义函数pd1,函数的类型应该是bool,因为要判断是否为"类幸运数字"吗. bool pd1(string s) //自定义函数 { int t=0

HDU 2462 The Luckiest number

传送门 题目大意: 定义只含有数字8的数为幸运数 给定正整数L,求L的所有倍数中最小的幸运数 算法思路: 设最终答案为x个8,则x满足(10x-1)*8/9≡0 (mod L) 化简:10x≡1 (mod n),其中n=9L/gcd(9L,8) 这是一个离散对数的问题,求解方法如下: 若gcd(10,n)>1,无解 若gcd(10,n)=1,由欧拉定理:10?(n)≡1 (mod n).可以证明,x为?(n)的约数,从小到大枚举约数即可 10l≡1 (mod n) 则成立的最小 l 是? (n)