求最小的
x
(
x
>
1
)
x(x>1)
x(x>1)满足
n
x
=
n
(
m
o
d
1
0
k
)
n^x=n(\mod 10^k)
nx=n(mod10k)。
值得注意的是这里并不能化成
n
x
−
1
=
1
(
m
o
d
1
0
k
)
n^{x-1}=1(\mod 10^k)
nx−1=1(mod10k),因为
n
n
n在
m
o
d
1
0
k
\mod 10^k
mod10k下不一定有逆元,典型的例子是
3
2
4
=
76
(
m
o
d
100
)
,
3
2
5
=
32
(
m
o
d
100
)
32^4=76(\mod 100),32^5=32(\mod 100)
324=76(mod100),325=32(mod100)。
将问题转成求最小的
y
(
y
≥
1
)
y(y\ge 1)
y(y≥1)满足
n
∗
n
y
=
n
(
m
o
d
1
0
k
)
n*n^y=n(\mod 10^k)
n∗ny=n(mod10k),有
x
=
y
+
1
x=y+1
x=y+1。
注意
n
m
o
d
1
0
i
n\mod 10^i
nmod10i就是
n
n
n的低
i
i
i位,因此如果要满足
n
∗
n
x
=
n
(
m
o
d
1
0
i
+
1
)
n*n^x=n(\mod 10^{i+1})
n∗nx=n(mod10i+1)就必须要满足
n
∗
n
x
=
n
(
m
o
d
1
0
i
)
n*n^x=n(\mod 10^i)
n∗nx=n(mod10i)。
设
y
i
y_i
yi为
n
∗
n
y
=
n
(
m
o
d
1
0
i
)
n*n^y=n(\mod 10^i)
n∗ny=n(mod10i)的最小解,
t
t
t为任意大于
0
0
0的整数,有
n
∗
n
t
y
i
=
(
n
∗
n
y
i
)
∗
n
(
t
−
1
)
y
i
=
n
∗
n
(
t
−
1
)
y
i
=
.
.
.
=
n
(
m
o
d
1
0
i
)
n*n^{ty_i}=(n*n^{y_i})*n^{(t-1)y_i}=n*n^{(t-1)y_i}=...=n(\mod 10^i)
n∗ntyi=(n∗nyi)∗n(t−1)yi=n∗n(t−1)yi=...=n(mod10i)
然后证明满足
n
∗
n
y
=
n
(
m
o
d
1
0
i
)
n*n^y=n(\mod 10^i)
n∗ny=n(mod10i)的解
y
y
y一定是
t
∗
y
i
t*y_i
t∗yi的形式(
t
t
t为任意正整数):
假设存在
x
>
y
(
x
m
o
d
y
≠
0
)
x>y(x\mod y\neq 0)
x>y(xmody=0)满足
n
∗
n
x
=
n
(
m
o
d
1
0
i
)
n*n^x=n(\mod 10^i)
n∗nx=n(mod10i),则
n
∗
n
x
=
(
n
∗
n
y
)
∗
n
x
−
y
=
n
∗
n
x
−
y
=
.
.
.
=
n
∗
n
x
m
o
d
y
=
n
(
m
o
d
1
0
i
)
n*n^x=(n*n^y)*n^{x-y}=n*n^{x-y}\\=...=n*n^{x\bmod y}=n(\mod 10^i)
n∗nx=(n∗ny)∗nx−y=n∗nx−y=...=n∗nxmody=n(mod10i)
于是
x
m
o
d
y
x\mod y
xmody也是一个解,由于
0
<
x
m
o
d
y
<
y
0<x\mod y<y
0<xmody<y,是比
y
y
y更小的非零解,这与
y
y
y是最小的非零解矛盾。
接下来找一个
t
t
t满足
n
∗
n
t
y
i
=
n
(
m
o
d
1
0
i
+
1
)
n*n^{ty_i}=n(\mod 10^{i+1})
n∗ntyi=n(mod10i+1),由上式可以知道
n
∗
n
t
y
i
n*n^{ty_i}
n∗ntyi的低
i
i
i位不会变,只需要找到一个
t
t
t满足
n
∗
n
t
y
i
n*n^{ty_i}
n∗ntyi的第
i
+
1
i+1
i+1位为
n
n
n的第
i
+
1
i+1
i+1位,由鸽巢原理,如果这样的
t
t
t存在,则
t
≤
10
t\le 10
t≤10。
因此只需要暴力枚举
t
t
t,如果
t
=
10
t=10
t=10没有找到,则直接输出
1
1
1。
为了方便,可以采用
p
y
t
h
o
n
python
python。
def iint():
ans=[]
sc=input().split()
for i in range(0,len(sc)):
ans.append(int(sc[i]))
return ans
def infloat():
ans=[]
sc=input().split()
for i in range(0,len(sc)):
ans.append(float(sc[i]))
return ans
def ilist():
return list(input())
n,k=iint()
mod=10**k
ni=n
ans=1
for i in range(1,k+1):
g=ni
m=10**i
flag=0
for j in range(1,11):
if n*g%m==n%m:
ni=g
flag=1
ans*=j
break
g=g*ni%mod
if not flag:
print(1)
exit(0)
print(ans+1)