@TOC欧拉定理
对于这道题,我们很容易的可以发现n只由数字1组成,容易得到
n
=
1
+
10
+
100
+
.
.
.
=
1
0
0
+
1
0
1
+
.
.
.
+
1
0
m
=
1
(
1
−
1
0
m
)
(
1
−
10
)
=
1
0
m
−
1
9
(
m
是
n
的位数
)
n=1+10+100+...=10^0+10^1+...+10^m=\frac{1(1-10^m)}{(1-10)}=\frac{10^m-1}{9}\\(m是n的位数)
n=1+10+100+...=100+101+...+10m=(1−10)1(1−10m)=910m−1(m是n的位数)
假设存在这么一个n,能够整除k,即
k
∣
n
k\mid n
k∣n
那么有如下推导:
n
=
1
0
m
−
1
9
≡
0
(
m
o
d
k
)
1
0
m
≡
1
(
m
o
d
9
k
)
n=\frac{10^m-1}{9}\equiv0(modk)\\\\ 10^m\equiv1(mod9k)
n=910m−1≡0(modk)10m≡1(mod9k)
容易发现,当k是2或5的倍数时一定不存在这样的n能被k整除,因此k一定与10互为质数,因此9k也与10互为质数,由欧拉定理
当
g
c
d
(
α
,
m
)
=
1
时,有
α
φ
(
m
)
≡
1
(
m
o
d
m
)
当gcd(\alpha,m)=1时,有\alpha^{\varphi(m)}\equiv 1(modm)
当gcd(α,m)=1时,有αφ(m)≡1(modm)
因此可以得到
1
0
φ
(
9
k
)
≡
1
(
m
o
d
9
k
)
10^{\varphi(9k)}\equiv 1(mod9k)
10φ(9k)≡1(mod9k)
将这两个表达式放一起
1
0
φ
(
9
k
)
≡
1
(
m
o
d
9
k
)
1
0
m
≡
1
(
m
o
d
9
k
)
10^{\varphi(9k)}\equiv 1(mod9k)\\ 10^m\equiv1(mod9k)
10φ(9k)≡1(mod9k)10m≡1(mod9k)
我们可以推测m为
φ
(
9
k
)
\varphi(9k)
φ(9k)的因子
因为 φ \varphi φ(9k)是一个满足条件的n的长度,但它不一定是最小的。
因此只需从小到大枚举 φ ( 9 k ) \varphi(9k) φ(9k)的因子,判断是不是合法的n即可。
class Solution:
def smallestRepunitDivByK(self, k: int) -> int:
if k%2==0 or k%5==0:
return -1
m=euler_phi(9*k)#该函数返回欧拉函数的值
for i in range(1,int(m)+1):
if m%i==0 and (10**i-1)%(9*k)==0:
return i
else:
return -1
现在框架有了,如何求欧拉函数呢,我们可以利用它的一个性质
将 1 − 1 p 1-\frac{1}{p} 1−p1化为 p − 1 p \frac{p-1}{p} pp−1的形式,我们得到一个求欧拉函数的方法
def euler_phi(n):
ans = n
for i in range(2, int(sqrt(n)) + 1):
if n % i == 0:
ans = ans /i*(i-1)
while n % i == 0:
n = n //i
if n > 1:
ans = ans /n*(n-1)
return ans
由此,整道题解完