当前位置: 代码迷 >> 综合 >> gym103261 I. Euclid‘s Algorithm
  详细解决方案

gym103261 I. Euclid‘s Algorithm

热度:53   发布时间:2023-10-29 04:17:50.0

题意

给你dddkkk
询问gcd((a+d)k?ak)gcd((a+d)^k-a^k)gcd((a+d)k?ak) 其中aaa为任意取值
dddkkk均为10^100

题解

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

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

CmnC_m^nCmn?中含有p的指数次数为m-n在p进制下的退位个数
即m-n在p进制下的退位个数为t,则有pt∣Cmnp^{t}| C_m^nptCmn?

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

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

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

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

高精度用python解决即可

def gcd (a,b):while (a!=0):t=b%ab=aa=treturn bd,k=list(map(int,input().split()))
if (k==2):print(d*(2-d%2))
else:ans=1while (1):now=gcd(k,d)if (now==1): breakk=k//nowans=ans*nowif (d%4==2): ans*=2print(ans*d)
  相关解决方案