最幸运的数字(同余方乘)
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
xx…xx/L
=
88
…
88
/
L
=88…88/L
=88…88/L
=
8
∗
11
…
11
/
L
=8*11…11/L
=8∗11…11/L
=
8
∗
(
99
…
99
/
9
)
/
L
=8*(99…99/9)/L
=8∗(99…99/9)/L
=
8
∗
(
(
1
0
x
−
1
)
/
9
)
/
L
=8*((10^x-1)/9)/L
=8∗((10x−1)/9)/L
=
(
1
0
x
−
1
)
/
(
9
∗
L
/
8
)
=(10^x-1)/(9*L/8)
=(10x−1)/(9∗L/8)
设d=gcd(8,L),c=9*L/d(为常数):
=
(
1
0
x
−
1
)
/
(
9
∗
L
/
d
)
=(10^x-1)/(9*L/d)
=(10x−1)/(9∗L/d)
=
(
1
0
x
−
1
)
/
c
=(10^x-1)/c
=(10x−1)/c
也 就 是 说 , c 可 以 整 除 ( 1 0 x − 1 ) 。 我 们 可 以 通 过 这 个 结 论 , 可 以 得 出 一 个 同 余 方 程 : 1 0 x ≡ 1 ( m o d c ) 也就是说,c可以整除(10^x-1)。我们可以通过这个结论,可以得出一个同余方程:10^x≡1 (mod c) 也就是说,c可以整除(10x−1)。我们可以通过这个结论,可以得出一个同余方程:10x≡1(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不互质时,无解 根据欧拉定理:当10和c互质时,10x≡1(modc)的其中一个解为φ(c)。并且,当10与c不互质时,无解
但
是
,
通
过
欧
拉
定
理
得
到
的
解
φ
(
c
)
,
并
不
是
题
目
中
要
求
的
最
小
解
因
此
我
们
还
要
通
过
这
个
解
来
求
出
1
0
x
≡
1
(
m
o
d
c
)
的
最
小
解
。
但是,通过欧拉定理得到的解\\varphi(c),并不是题目中要求的最小解因此我们还要通过这个解来求出10^x≡1 (mod c)的最小解。
但是,通过欧拉定理得到的解φ(c),并不是题目中要求的最小解因此我们还要通过这个解来求出10x≡1(modc)的最小解。
设
x
为
最
小
解
,
那
么
x
一
定
可
以
整
除
φ
(
c
)
。
因
此
我
们
可
以
枚
举
φ
(
c
)
的
所
有
约
数
,
将
其
带
入
约
数
方
程
中
,
找
出
最
小
值
设x为最小解,那么x一定可以整除\\varphi(c)。因此我们可以枚举\\varphi(c)的所有约数,将其带入约数方程中,找出最小值
设x为最小解,那么x一定可以整除φ(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)是欧拉函数
1、欧拉定理:gcd(a,n)=1,则aφ(n)≡1(modn)其中,φ(n)是欧拉函数
2
、
证
明
:
最
小
解
x
一
定
可
以
整
除
φ
(
c
)
。
我
们
可
以
通
过
反
证
法
来
证
明
2、证明:最小解x一定可以整除\\varphi(c)。我们可以通过反证法来证明
2、证明:最小解x一定可以整除φ(c)。我们可以通过反证法来证明
如
果
x
不
能
整
除
φ
(
c
)
,
那
么
φ
(
c
)
=
q
∗
x
+
r
(
r
<
x
)
如果x不能整除\\varphi(c),那么\\varphi(c)=q*x+r(r<x)
如果x不能整除φ(c),那么φ(c)=q∗x+r(r<x)
如
果
x
满
足
同
余
方
程
,
那
么
q
x
也
一
定
满
足
同
余
方
程
。
我
们
还
知
道
q
∗
x
+
r
也
是
满
足
同
余
方
程
的
,
如果x满足同余方程,那么qx也一定满足同余方程。我们还知道q*x+r也是满足同余方程的,
如果x满足同余方程,那么qx也一定满足同余方程。我们还知道q∗x+r也是满足同余方程的,
这
样
就
可
以
得
出
r
是
满
足
同
余
方
程
的
。
因
为
r
<
x
,
与
最
小
解
为
x
的
前
提
相
矛
盾
。
因
此
最
小
解
x
一
定
可
以
整
除
φ
(
c
)
。
这样就可以得出r是满足同余方程的。因为r<x,与最小解为x的前提相矛盾。因此最小解x一定可以整除\\varphi(c)。
这样就可以得出r是满足同余方程的。因为r<x,与最小解为x的前提相矛盾。因此最小解x一定可以整除φ(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以上是关于最幸运的数字(同余方乘)的主要内容,如果未能解决你的问题,请参考以下文章
牛客 - Yuki with emofunc and playf(同余最短路)