约数之和
假设现在有两个自然数 A 和 B,S 是 AB 的所有约数之和。
请你求出 Smod9901 的值是多少。
输入格式
在一行中输入用空格隔开的两个整数 A 和 B。
输出格式
输出一个整数,代表 Smod9901 的值。
数据范围
0≤A,B≤5×107
输入样例:
2 3
输出样例:
15
注意: A 和 B 不会同时为 0。
算法:分治,递归,数论
分析:
快速幂:
https://blog.youkuaiyun.com/weixin_51867853/article/details/121682062?spm=1001.2014.3001.5501
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;
typedef long long LL;
const int mod = 9901;
unordered_map<int, int> primes;
int qmi(LL a, LL b)
{
LL res = 1;
while(b)
{
if(b & 1) res = res * a % mod;
b >>= 1;
a = a * a % mod;
}
return res;
}
void get_primes(int n)
{
for(int i = 2; i <= n / i; i++)
{
if(n % i == 0)
{
while(n % i == 0)
{
primes[i]++;
n /= i;
}
}
}
if(n > 1) primes[n]++;
}
LL get_sum(LL p,LL k)
{
if(k == 0) return 1;
else if(k % 2 == 1)
{
return (1 + qmi(p, k / 2 + 1)) * get_sum(p, k / 2) % mod;
}
else return qmi(p, k) + get_sum(p, k - 1);
}
int main()
{
int a, b;
cin >> a >> b;
if(a == 0)
{
cout << 0 << endl;
return 0;
}
if(b == 0)
{
cout << 1 << endl;
return 0;
}
get_primes(a);
LL res = 1;
for(auto prime : primes)
{
LL p = prime.first, k = prime.second;
k *= b;
res = res * get_sum(p, k) % mod;
}
cout << res << endl;
return 0;
}