gym103261 I. Euclid‘s Algorithm

题意

给你 d d d k k k
询问 g c d ( ( a + d ) k − a k ) gcd((a+d)^k-a^k) gcd((a+d)kak) 其中 a a a为任意取值
d d d k k k均为10^100

题解

看题目形式,显然是一个代码非常简短的数论题
不知道为啥过了一片,可能我们队伍的数论水平低于平均水平吧

首先先展开一下
( a + d ) k − a k = ∑ i = 1 k C k i d i a k − i (a+d)^k-a^k=\sum_{i=1}^kC_k^id^{i}a^{k-i} (a+d)kak=i=1kCkidiaki
先对每一种质数 p p p分开考虑
考虑到,如果 a a a也拥有 p p p的话,答案在大多数情况都会变大,这对我们取gcd是不优的
故先考虑 a a a不包含 p p p的情况
先引入kummer定理

C m n C_m^n Cmn中含有p的指数次数为m-n在p进制下的退位个数
即m-n在p进制下的退位个数为t,则有 p t ∣ C m n p^{t}| C_m^n ptCmn

不放先设 d = d ′ ∗ p A , k = k ′ ∗ p B d=d'*p^A,k=k'*p^B d=dpA,k=kpB
如果 A = 0 A=0 A=0显然就不用考虑这个质数了
对于一个 i i i来说,包含 p p p的次幂为
t = A i + B − f ( i , p ) t=Ai+B-f(i,p) t=Ai+Bf(i,p),其中 f ( i , p ) f(i,p) f(i,p) p p p i i i中的次幂
稍微解释一下 B − f ( i , p ) B-f(i,p) Bf(i,p),这个等式至少在 f ( i , p ) < B f(i,p)<B f(i,p)<B i < p B i<p^B i<pB时成立,在后文可以知道最小值仅需讨论这一范围就可以了
此时可以发现 A i Ai Ai随着 i i i增加每次最少会增加 A ≥ 1 A≥1 A1,而 f ( i , p ) f(i,p) f(i,p)的增量是不会超过 1 1 1
t t t至少是单调不降的
i = 1 i=1 i=1 t = A + B t=A+B t=A+B
i = 2 i=2 i=2 t = 2 A + B − f ( i , p ) t=2A+B-f(i,p) t=2A+Bf(i,p)
A > 1 A>1 A>1时, i = 1 i=1 i=1 t t t时唯一最小的,也就是p的贡献就是 p A + B p^{A+B} pA+B
但当 A = 1 A=1 A=1时,如果 f ( 2 , p ) = 1 f(2,p)=1 f(2,p)=1,那么 i = 1 i=1 i=1 i = 2 i=2 i=2的次数是一样的,也就是两项会合并
这种情况当且仅当 p = 2 p=2 p=2
合并之后贡献即为 2 ∗ p A + B 2*p^{A+B} 2pA+B,也就是此时答案要乘 2 2 2
稍微验证一下, i = 3 i=3 i=3是不可能和 i = 1 , i = 1 i=1,i=1 i=1,i=1同时相同的
但同时你会发现,若 k = 2 k=2 k=2, a a a此时就有用了,因为在 i = 2 i=2 i=2时, a a a的系数为 0 0 0,故我们可以通过调整 a a a是的两项的 p p p的指数发生改变而不能合并,此时答案将会变小

故对于 k = 2 k=2 k=2的情况分开讨论即可

接下来,接下来的答案即为d出现过的质因子在k中出现的次数*d
这一步用一个简单的gcd就可以了

时间复杂度 O ( l o g 2 ( k ) ) O(log^2(k)) O(log2(k))

高精度用python解决即可

def gcd (a,b):
    while (a!=0):
        t=b%a
        b=a
        a=t
    return b

d,k=list(map(int,input().split()))
if (k==2):
    print(d*(2-d%2))
else:
    ans=1
    while (1):
        now=gcd(k,d)
        if (now==1): break
        k=k//now
        ans=ans*now
    if (d%4==2): ans*=2
    print(ans*d)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值