题意
给你ddd和kkk
询问gcd((a+d)k?ak)gcd((a+d)^k-a^k)gcd((a+d)k?ak) 其中aaa为任意取值
ddd和kkk均为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=1∑k?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^npt∣Cmn?
不放先设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)为ppp在iii中的次幂
稍微解释一下B?f(i,p)B-f(i,p)B?f(i,p),这个等式至少在f(i,p)<Bf(i,p)<Bf(i,p)<B即i<pBi<p^Bi<pB时成立,在后文可以知道最小值仅需讨论这一范围就可以了
此时可以发现AiAiAi随着iii增加每次最少会增加A≥1A≥1A≥1,而f(i,p)f(i,p)f(i,p)的增量是不会超过111的
故ttt至少是单调不降的
i=1i=1i=1时t=A+Bt=A+Bt=A+B
i=2i=2i=2时t=2A+B?f(i,p)t=2A+B-f(i,p)t=2A+B?f(i,p)
故A>1A>1A>1时,i=1i=1i=1时ttt时唯一最小的,也就是p的贡献就是pA+Bp^{A+B}pA+B了
但当A=1A=1A=1时,如果f(2,p)=1f(2,p)=1f(2,p)=1,那么i=1i=1i=1和i=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)