马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
原题目链接
问题描述
假设现在有两个自然数 A 和 B,设 S 为 A^B 的所有约数之和。
请你盘算:S mod 9901 的值。
输入格式
在一行中输入两个用空格隔开的整数 A 和 B。
输出格式
输出一个整数,表现 S mod 9901 的值。
数据范围
- 0 ≤ A, B ≤ 5 × 10^7
- A 和 B 不会同时为 0
输入样例
输出样例
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企服之家,中国第一个企服评测及商务社交产业平台。 |