AcWing 97. 约数之和
原题链接
中等
作者:
皓首不倦
,
2020-09-15 02:15:20
,
所有人可见
,
阅读 331
'''
拆解成等比数列之和的乘积形式求解
'''
MOD = 9901
def pow_mod(a, k, p):
t = []
pow_val = 1 # 2的次幂数, 初始是2^0 = 1
a_pow = a % p # a^(2 ^ i)的数值, 初始是a^(2^0) = a
while pow_val <= k:
t.append(a_pow)
a_pow = (a_pow*a_pow) % p
pow_val <<= 1
ans = 1
for i in range(len(t)):
if k & 1:
ans = (ans * t[i]) % p
k >>= 1
return ans
import math
# 分解质因数函数,返回元组数组[ (质因子1, 次幂1), (质因子2, 次幂2), (质因子3, 次幂3) ...... ]
def devide_prime(val):
ans = []
for i in range(2, int(math.sqrt(val)) + 1):
if val % i == 0:
cnt = 0
while val % i == 0:
val //= i
cnt += 1
ans.append((i, cnt))
if val == 1:
break
# 特判最后可能剩下的大于sqrt(val)的最大的质因子
if val != 1:
ans.append((val, 1))
return ans
a, b = map(int, input().split())
if a == 0 or a == 1:
print(a)
else:
primes = devide_prime(a)
ans = 1
for p, q in primes:
# 算等比数列的和
q *= b
_val = pow_mod(p-1, MOD - 2, MOD) # p-1的逆元
if _val != 0:
val = (((pow_mod(p, q+1, MOD) - 1) % MOD) * _val) % MOD
else:
val = ((p**(q+1) - 1) // (p-1)) % MOD
ans = (ans * val) % MOD
print(ans)