题意
给你
d
d
d和
k
k
k
询问
g
c
d
(
(
a
+
d
)
k
−
a
k
)
gcd((a+d)^k-a^k)
gcd((a+d)k−ak) 其中
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)k−ak=i=1∑kCkidiak−i
先对每一种质数
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 pt∣Cmn
不放先设
d
=
d
′
∗
p
A
,
k
=
k
′
∗
p
B
d=d'*p^A,k=k'*p^B
d=d′∗pA,k=k′∗pB
如果
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+B−f(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)
B−f(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
A≥1,而
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+B−f(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}
2∗pA+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)