最幸运的数字(同余方乘)

Posted li_wen_zhuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最幸运的数字(同余方乘)相关的知识,希望对你有一定的参考价值。

题目描述

8 是中国的幸运数字,如果一个数字的每一位都由 8 构成则该数字被称作是幸运数字。
现在给定一个正整数 L,请问至少多少个 8 连在一起组成的正整数(即最小幸运数字)是 L 的倍数。

输入格式

输入包含多组测试用例。
每组测试用例占一行,包含一个整数 L。
当输入用例 L=0 时,表示输入终止,该用例无需处理。

输出格式

每组测试用例输出结果占一行。
结果为 Case i:+一个整数 N,N 代表满足条件的最小幸运数字的位数。
如果满足条件的幸运数字不存在,则 N=0。

数据范围

1≤L≤2×109

输入样例
8
11
16
0
输出样例
Case 1: 1
Case 2: 2
Case 3: 0

题目分析

题目要求我们找出最小的全是8的数,使其能够整除L。
假设答案有x位数: x x … x x / L xx…xx/L xxxx/L
= 88 … 88 / L =88…88/L =8888/L
= 8 ∗ 11 … 11 / L =8*11…11/L =81111/L
= 8 ∗ ( 99 … 99 / 9 ) / L =8*(99…99/9)/L =8(9999/9)/L
= 8 ∗ ( ( 1 0 x − 1 ) / 9 ) / L =8*((10^x-1)/9)/L =8((10x1)/9)/L
= ( 1 0 x − 1 ) / ( 9 ∗ L / 8 ) =(10^x-1)/(9*L/8) =(10x1)/(9L/8)
设d=gcd(8,L),c=9*L/d(为常数): = ( 1 0 x − 1 ) / ( 9 ∗ L / d ) =(10^x-1)/(9*L/d) =(10x1)/(9L/d)
= ( 1 0 x − 1 ) / c =(10^x-1)/c =(10x1)/c

也 就 是 说 , c 可 以 整 除 ( 1 0 x − 1 ) 。 我 们 可 以 通 过 这 个 结 论 , 可 以 得 出 一 个 同 余 方 程 : 1 0 x ≡ 1 ( m o d c ) 也就是说,c可以整除(10^x-1)。我们可以通过这个结论,可以得出一个同余方程:10^x≡1 (mod c) c(10x1)10x1(modc)

根 据 欧 拉 定 理 : 当 10 和 c 互 质 时 , 1 0 x ≡ 1 ( m o d c ) 的 其 中 一 个 解 为 φ ( c ) 。 并 且 , 当 10 与 c 不 互 质 时 , 无 解 根据欧拉定理:当10和c互质时,10^x≡1 (mod c)的其中一个解为\\varphi(c)。并且,当10与c不互质时,无解 10c10x1(modc)φ(c)10c

但 是 , 通 过 欧 拉 定 理 得 到 的 解 φ ( c ) , 并 不 是 题 目 中 要 求 的 最 小 解 因 此 我 们 还 要 通 过 这 个 解 来 求 出 1 0 x ≡ 1 ( m o d c ) 的 最 小 解 。 但是,通过欧拉定理得到的解\\varphi(c),并不是题目中要求的最小解因此我们还要通过这个解来求出10^x≡1 (mod c)的最小解。 φ(c)10x1(modc)
设 x 为 最 小 解 , 那 么 x 一 定 可 以 整 除 φ ( c ) 。 因 此 我 们 可 以 枚 举 φ ( c ) 的 所 有 约 数 , 将 其 带 入 约 数 方 程 中 , 找 出 最 小 值 设x为最小解,那么x一定可以整除\\varphi(c)。因此我们可以枚举\\varphi(c)的所有约数,将其带入约数方程中,找出最小值 xxφ(c)φ(c) 即 可 。 即可。

补 充 : 补充:
1 、 欧 拉 定 理 : g c d ( a , n ) = 1 , 则 a φ ( n ) ≡ 1 ( m o d n ) 其 中 , φ ( n ) 是 欧 拉 函 数 1、欧拉定理: gcd(a,n)=1,则 a^{\\varphi(n)}≡1(modn)其中,\\varphi(n)是欧拉函数 1gcd(a,n)=1,aφ(n)1(modn),φ(n)

2 、 证 明 : 最 小 解 x 一 定 可 以 整 除 φ ( c ) 。 我 们 可 以 通 过 反 证 法 来 证 明 2、证明:最小解x一定可以整除\\varphi(c)。我们可以通过反证法来证明 2xφ(c)
如 果 x 不 能 整 除 φ ( c ) , 那 么 φ ( c ) = q ∗ x + r ( r < x ) 如果x不能整除\\varphi(c),那么\\varphi(c)=q*x+r(r<x) xφ(c)φ(c)=qx+r(r<x)
如 果 x 满 足 同 余 方 程 , 那 么 q x 也 一 定 满 足 同 余 方 程 。 我 们 还 知 道 q ∗ x + r 也 是 满 足 同 余 方 程 的 , 如果x满足同余方程,那么qx也一定满足同余方程。我们还知道q*x+r也是满足同余方程的, xqxqx+r 这 样 就 可 以 得 出 r 是 满 足 同 余 方 程 的 。 因 为 r < x , 与 最 小 解 为 x 的 前 提 相 矛 盾 。 因 此 最 小 解 x 一 定 可 以 整 除 φ ( c ) 。 这样就可以得出r是满足同余方程的。因为r<x,与最小解为x的前提相矛盾。因此最小解x一定可以整除\\varphi(c)。 rr<xxxφ(c)

代码如下
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <algorithm>
#define LL long long
#define ULL unsigned long long
#define PII pair<int,int>
#define x first
#define y second
using namespace std;
const int N=1e6+5,INF=0x3f3f3f3f;
LL euler(LL C)					//求C的欧拉函数
{
    LL ans=C;
    for(int i=2;i<=C/i;i++)
        if(C%i==0)
        {
            while(C%i==0) C/=i;
            ans=ans/i*(i-1);
        }
    if(C>1) ans=ans/C*(C-1);
    return ans;
}
LL mul(LL a,LL b,LL mod)		//龟速乘法(因此C最大能达到1e10,快速幂的过程中会爆long long,因此我们需要用龟速乘法)
{
    LL res=0;
    while(b)
    {
        if(b&1) res=(res+a)%mod;
        a=(a+a)%mod;
        b>>=1;
    }
    return res;
}
LL kmi(LL a,LL k,LL mod)		//快速幂
{
    LL res=1;
    while(k)
    {
        if(k&1) res=mul(res,a,mod);
        a=mul(a,a,mod);
        k>>=1;
    }
    return res;
}
int main()
{
    LL L,t=1;
    while(cin>>L,L)
    {
        int d=__gcd(L,8ll);
        LL C=9*L/d;						//求出C
        LL phi=euler(C);				//同余方程的一个解phi(C)
        LL ans=1e18;
        if(C%2==0||C%5==0) ans=0;		//当C与10不互质时,无解
        else 
        for(LL i&#

以上是关于最幸运的数字(同余方乘)的主要内容,如果未能解决你的问题,请参考以下文章

Acwing202. 最幸运的数字

牛客 - Yuki with emofunc and playf(同余最短路)

ACM选修HUST1058(市赛题) Lucky Sequence 同余定理

幸运数字

三:排序-幸运数字

CodeforcesRound #460 E - Congruence Equation 中国剩余定理+数论