IT评测·应用市场-qidao123.com技术社区
标题:
经典算法 约数之和
[打印本页]
作者:
tsx81428
时间:
2025-4-9 02:23
标题:
经典算法 约数之和
原题目链接
问题描述
假设现在有两个自然数 A 和 B,设 S 为 A^B 的
所有约数之和
。
请你盘算:S mod 9901 的值。
输入格式
在一行中输入两个用空格隔开的整数 A 和 B。
输出格式
输出一个整数,表现 S mod 9901 的值。
数据范围
0 ≤ A, B ≤ 5 × 10^7
A 和 B 不会同时为 0
输入样例
2 3
复制代码
输出样例
15
复制代码
c++代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll A, B;
//求a^b对p取模
ll mypow(ll a, ll b, ll p) {
if (b == 0) return 1 % p;
if (b == 1) return a % p;
__int128_t k = mypow(a, b / 2, p);
if (b % 2 == 0) return (k * k) % p;
else return (k * k * a) % p;
}
//求p^0 + p^1 + p^2 + p^3 + ... + p^k
ll sum_of_a_geometric_series(ll p, ll k) {
if (k == 0) return 1;
if (k == 1) return 1 + p;
if (k % 2 == 0) {
ll a = mypow(p, k, 9901);
ll b = a + sum_of_a_geometric_series(p, k - 1);
return b % 9901;
}
else {
ll a = mypow(p, k / 2 + 1, 9901) + 1;
ll b = a * sum_of_a_geometric_series(p, k / 2);
return b % 9901;
}
}
ll prime_factorization() {
if (A == 0) return 0;
if (A == 1 || B == 0) return 1;
ll ans = 1;
for (int i = 2; i <= A; i++) {
ll cont = 0;
while(A % i == 0) A /= i, cont++;
if (cont == 0) continue;
cont *= B;
ans *= sum_of_a_geometric_series(i, cont);
ans %= 9901;
}
return ans;
}
int main() {
cin >> A >> B;
cout << prime_factorization();
return 0;
}//by wqs
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/)
Powered by Discuz! X3.4