51nod1359 循环探求

求最小的 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) nx1=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(y1)满足 n ∗ n y = n ( m o d    1 0 k ) n*n^y=n(\mod 10^k) nny=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}) nnx=n(mod10i+1)就必须要满足 n ∗ n x = n ( m o d    1 0 i ) n*n^x=n(\mod 10^i) nnx=n(mod10i)
y i y_i yi n ∗ n y = n ( m o d    1 0 i ) n*n^y=n(\mod 10^i) nny=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) nntyi=(nnyi)n(t1)yi=nn(t1)yi=...=n(mod10i)
然后证明满足 n ∗ n y = n ( m o d    1 0 i ) n*n^y=n(\mod 10^i) nny=n(mod10i)的解 y y y一定是 t ∗ y i t*y_i tyi的形式( 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) nnx=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) nnx=(nny)nxy=nnxy=...=nnxmody=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}) nntyi=n(mod10i+1),由上式可以知道 n ∗ n t y i n*n^{ty_i} nntyi的低 i i i位不会变,只需要找到一个 t t t满足 n ∗ n t y i n*n^{ty_i} nntyi的第 i + 1 i+1 i+1位为 n n n的第 i + 1 i+1 i+1位,由鸽巢原理,如果这样的 t t t存在,则 t ≤ 10 t\le 10 t10
因此只需要暴力枚举 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值