经典算法 约数之和

原题目链接

问题描述

假设现在有两个自然数 AB,设 SA^B所有约数之和

请你计算:S mod 9901 的值。


输入格式

在一行中输入两个用空格隔开的整数 AB


输出格式

输出一个整数,表示 S mod 9901 的值。


数据范围

  • 0 ≤ A, B ≤ 5 × 10^7
  • AB 不会同时为 0

输入样例

in 复制代码
2 3

输出样例

out 复制代码
15

c++代码

cpp 复制代码
#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
相关推荐
禾小西1 小时前
Java 逐梦力扣之旅_[204. 计数质数]
java·算法·leetcode
LuckyLay1 小时前
LeetCode算法题(Go语言实现)_32
算法·leetcode·golang
ゞ 正在缓冲99%…1 小时前
leetcode295.数据流的中位数
java·数据结构·算法·leetcode·
文弱_书生1 小时前
关于点扩散函数小记
数码相机·算法·数学原理
爪娃侠1 小时前
LeetCode热题100记录-【二叉树】
linux·算法·leetcode
圣保罗的大教堂2 小时前
《算法笔记》9.8小节——图算法专题->哈夫曼树 问题 E: 合并果子-NOIP2004TGT2
算法
独好紫罗兰2 小时前
洛谷题单3-P1720 月落乌啼算钱(斐波那契数列)-python-流程图重构
开发语言·算法·leetcode
啥都鼓捣的小yao3 小时前
Python解决“数字插入”问题
python·算法
qystca4 小时前
蓝桥云客--回文数组
算法
每次的天空4 小时前
Android学习总结之算法篇五(字符串)
android·学习·算法