2019-2020PtrCampDay8-I.Euclid's Algorithm-数论

link:https://codeforces.com/gym/103261/problem/I
题意:给 k,d,求 {(a+d)kak|aN}gcd1k,d10100.


来复读一下题解

对每个质因子 p 考虑其对答案的贡献(好像其实很合理)
(a+d)kak=i=1k(ki)diaki,对于 gcd 来说,p 的幂次取决于使得其幂次最小的 a

  • (1)如果 p 不是 d 的因子,取 a=p,则 (a+d)kakdk0(modp),对答案没有贡献
  • (2)否则假设 d 中有 qdp 因子,k 中有 qkp 因子,同时为了使得幂次最小,我们不妨考虑 gcd(a,p)=1 的那些 a,那么对于每一项 (ki)diaki 而言,恰有 qkqi+i×qdp 因子
  • i 变大 1 之后,因子个数会先变多 qd 个,而我们假设 p|d,那么 qd1,而 qi 可能不变,可能减少 1
  • 对于大部分 qd>1 情况来说,显然 p 因子个数只取决于第一项,因为每往后一项至少多一个 p 因子,肯定没法通过加法( p 进制下的进位)得到更多的 p 因子,因此 qd>1 时质因子的贡献就是 qk+qd.
  • 而这里有一个魔鬼细节,对于 qd=1i=1i=2 要想保持不变,必然有 q1=0,q2=1,也就是只有 p=2 的情况是特殊的:此时这两项都是 qk0+1=qk+1qk1+2=qk+1p=2 的因子,往后也依然是这样,这时候至少有 qk+2p=2 因子
  • 而这里又可以断言,其实至多也是 qk+2p=2 因子!!!因为考虑 (a+2d)kakqk+1+1=qk+2p 因子,而它会等于 [(a+2d)k(a+d)k]+[(a+d)kak],右边是 qd=1 的两个式子相加,如果其至少有 qk+3p 因子,左边则至少有 qk+3p 因子,这是矛盾的

综上,对每个 p 因子有两种case:

  • 首先,必须要 p|d 才有贡献:、
  • (1)一般情况是 qk+qd 的贡献
  • (2)特殊的,p=2qd=1,则幂次是 qk+2

然后我们去写一发,发现wa了,为什么呢…
(2)里面还有bug…如果 k 刚刚好是 2(a+d)2a2=d(2a+d),答案应该直接是 d×gcd(2,d),在一些情况下会和上面说的不一样(具体地,p=2,qd=1 时),因为但为什么会出现这种情况呢…这时候对应(2)的特殊情况,qk=1 的话,

ChatGPT写的Python代码:

import math
import sys
def main():
d, k = map(int, sys.stdin.read().split())
if k==2:
print(math.gcd(k,d)*d)
return
qd, qk = 0, 0
while d % 2 == 0:
d //= 2
qd += 1
while k % 2 == 0:
k //= 2
qk += 1
ans = d * math.gcd(pow(d, 332), k)
if qd == 1:
ans *= 2 ** (qk + 2)
elif qd!=0:
ans *= 2 ** (qk + qd)
print(ans)
if __name__ == "__main__":
main()
posted @   yoshinow2001  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示