ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

The Luckiest number(同余+欧拉定理)

2021-05-11 19:01:25  阅读:213  来源: 互联网

标签:Luckiest 10 frac gcd res ll number 同余 9L


题目传送门

单词小讲堂

consist 组成
multiple 倍数
construct 构建,构造

题目大意

这个题的意思就是说,中国人认为8是吉祥数,当然了鲍勃有自己的吉祥数L,但是鲍勃喜欢中国女生,所以希望自己的吉祥数L的倍数可以是8888888……(n个8),下面给出一些L请你找出这些8的最小位数,如果不行,输出0即可!

思路

公式预警!!
考虑到 8888888 … … = ( 100000000000 … … − 1 ) ∗ 8 9 8888888……=(100000000000……-1)*\frac{8}{9} 8888888……=(100000000000……−1)∗98​
因此这道题就可以表示为 L ∣ 8 9 ∗ ( 1 0 y − 1 ) L|\frac{8}{9}*(10^y-1) L∣98​∗(10y−1)
9 L ∣ 8 ∗ ( 1 0 y − 1 ) 9L|8*(10^y-1) 9L∣8∗(10y−1)
两边同时除以 g c d ( 9 L , 8 ) gcd(9L,8) gcd(9L,8)
9 L g c d ( 9 L , 8 ) ∣ 8 g c d ( 9 L , 8 ) ∗ ( 1 0 y − 1 ) \frac{9L}{gcd(9L,8)}|\frac{8}{gcd(9L,8)}*(10^y-1) gcd(9L,8)9L​∣gcd(9L,8)8​∗(10y−1)
那么现在 9 L g c d ( 9 L , 8 ) 和 8 g c d ( 9 L , 8 ) \frac{9L}{gcd(9L,8)} 和\frac{8}{gcd(9L,8)} gcd(9L,8)9L​和gcd(9L,8)8​互质
因此 9 L g c d ( 9 L , 8 ) ∣ ( 1 0 y − 1 ) \frac{9L}{gcd(9L,8)}|(10^y-1) gcd(9L,8)9L​∣(10y−1)结果就是 y y y的最小值
为嘛?因为 8 g c d ( 9 L , 8 ) \frac{8}{gcd(9L,8)} gcd(9L,8)8​是小于 10 10 10的数,因此位数就是 y y y的值。
令 n = 9 L g c d ( 9 L , 8 ) n=\frac{9L}{gcd(9L,8)} n=gcd(9L,8)9L​
转化成为了 k ∗ n = 1 0 y − 1 k*n=10^y-1 k∗n=10y−1
啊,这不就是我们的同余公式嘛
1 0 y ≡ 1 ( m o d n ) 10^y≡1(mod n) 10y≡1(modn)
好了,现在我们只需要求 y y y的值就可以了!
下面我们介绍拓展欧拉定理的一个小结论

若正整数 a , n a,n a,n互质,则满足 a x ≡ 1 ( m o d n ) a^x≡1(mod n) ax≡1(modn)的最小正整数 x 0 x_0 x0​是 φ ( n ) φ(n) φ(n)的约数

那么我们现在逐一枚举 φ ( n ) φ(n) φ(n)的因子,就可以了。(需要快速幂优化)

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
ll phi(ll x)
{
    ll res = x;
    for (ll i = 2; i <= x / i; i ++ )
        if (x % i == 0)
        {
            res = res / i * (i - 1);
            while (x % i == 0) x /= i;
        }
    if (x > 1) res = res / x * (x - 1);

    return res;
}
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll qmi(ll m, ll k, ll p)
{
    ll res = 1 % p, t = m;
    while (k)
    {
        if (k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}

int main(){
    ll n,t=0;
    while(cin>>n&&n){
        ll k=gcd(9*n,8);
        //if(k==1){
        //    cout<<"Case "<<++t<<": 0\n";
        //    continue;
        //}
        ll p=9*n/k;
        if(gcd(p,10)!=1){
            cout<<"Case "<<++t<<": 0\n";
            continue;
        }
        ll e=phi(p);
        int ju=0;
        for(ll i=1;i<=e/i;i++){
            if(e%i==0&&qmi(10,i,p)==1){
                printf("Case %lld: %lld\n",++t,i);
                ju=1;
                break;
            }
        }
        if(ju)continue;
        for(ll i=sqrt(e);i>=1;i--){
            if(e%(e/i)==0&&qmi(10,e/i,p)==1){
                printf("Case %lld: %lld\n",++t,e/i);
                break;
            }
        }
    }
}


标签:Luckiest,10,frac,gcd,res,ll,number,同余,9L
来源: https://blog.csdn.net/m0_51841071/article/details/116664690

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有