#tYybttg060403. 1633:【例 3】Sumdiv

1633:【例 3】Sumdiv

1633:【例 3】Sumdiv

题目描述

ABA^B 的所有约数之和 mod9901\bmod 9901

输入格式

输入两个整数 A,BA,B

输出格式

输出答案 mod9901\bmod 9901

样例

样例输入 #1

2 3

样例输出 #1

15

样例解释 #1

23=82^3 = 888 的所有约数为 1,2,4,81,2,4,81+2+4+8=151+2+4+8=1515mod9901=1515 \bmod 9901 = 15,因此输出 1515

数据范围

对于全部数据,0A,B5×1070 \le A,B \le 5 \times 10^7

时空限制

  • 时间限制:1000 ms
  • 内存限制:524288 KB

注意:本题需要计算 ABA^B 的所有约数之和。设 AA 的质因数分解为 A=p1a1p2a2pkakA = p_1^{a_1} p_2^{a_2} \cdots p_k^{a_k},则 AB=p1a1Bp2a2BpkakBA^B = p_1^{a_1 B} p_2^{a_2 B} \cdots p_k^{a_k B}ABA^B 的约数之和为:

$$\sigma(A^B) = \prod_{i=1}^k (1 + p_i + p_i^2 + \cdots + p_i^{a_i B}) = \prod_{i=1}^k \frac{p_i^{a_i B + 1} - 1}{p_i - 1}$$

因此,我们需要对 AA 分解质因数,然后对每个质因子 pip_i 计算 piaiB+11pi1mod9901\frac{p_i^{a_i B + 1} - 1}{p_i - 1} \bmod 9901,最后将所有结果相乘再取模。

由于 A,BA,B 可能很大,直接计算 piaiB+1p_i^{a_i B + 1} 会溢出,需要使用快速幂取模。但分母 pi1p_i - 1 可能不是 99019901 的倍数,需要求其模 99019901 下的逆元(因为 99019901 是质数,可以用费马小定理求逆元)。注意:如果 pi1(mod9901)p_i \equiv 1 \pmod{9901},则 pi1p_i - 199019901 的倍数,此时公式 piaiB+11pi1\frac{p_i^{a_i B + 1} - 1}{p_i - 1} 在模 99019901 下不能直接除,需要特殊处理。此时 pi1(mod9901)p_i \equiv 1 \pmod{9901},所以 $1 + p_i + p_i^2 + \cdots + p_i^{a_i B} \equiv 1 + 1 + 1 + \cdots + 1 = a_i B + 1 \pmod{9901}$。因此,在这种情况下,该因子的贡献为 aiB+1mod9901a_i B + 1 \bmod 9901

算法步骤:

  1. AA 分解质因数(A5×107A \le 5\times 10^7,可以用试除法,枚举到 A\sqrt{A})。
  2. 对于每个质因子 pp 及其指数 aa,计算 t=a×Bt = a \times B
  3. 如果 pmod9901==1p \bmod 9901 == 1,则贡献 =(t+1)mod9901= (t + 1) \bmod 9901
  4. 否则,贡献 $= \frac{(p^{t+1} \bmod 9901 - 1 + 9901) \bmod 9901 \times \text{inv}(p-1) \bmod 9901$,其中 inv(p1)\text{inv}(p-1)p1p-199019901 的逆元(可用费马小定理:inv=(p1)99012mod9901inv = (p-1)^{9901-2} \bmod 9901)。
  5. 将所有贡献相乘取模 99019901

注意:AA 可能为 0011。如果 A=0A=0,则 AB=0A^B=0B>0B>0)或 11B=0B=0)。但 00 的约数之和通常定义为 00?实际上,00 有无限个约数,但题目中 A,BA,B 是非负整数,A=0A=0 时需要特判:

  • 如果 B=0B=0,则 000^0 无定义,但题目可能保证 A,BA,B 不同时为 00?数据范围 0A,B0 \le A,B,可能同时为 00。根据约定,通常 000^0 未定义,但题目可能规避。为安全起见,特判:如果 A=0A=0,输出 00(因为 0B=00^B=0B>0B>0),其约数之和可以认为是 00;如果 B=0B=0A=0A=0,输出 11?但题目没有明确,根据样例可能不会出现)。实际上,A=0A=0B>0B>0 时,AB=0A^B=0,其约数之和为 00(因为 00 没有正约数?但 00 可以被任何非零数整除,所以约数个数无限,但约数之和发散?在数论中通常不考虑 00 的约数之和)。题目可能保证 A>0A>0?数据范围包括 00,但实际测试可能 A>0A>0。为保险,特判:如果 A=0A=0,输出 00

如果 A=1A=1,则 AB=1A^B=1,约数之和为 11

另外,99019901 是质数,可以使用快速幂求逆元。注意取模时避免负数。