经典算法 约数之和

原题目链接

问题描述

假设现在有两个自然数 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
相关推荐
Miraitowa_cheems6 小时前
LeetCode算法日记 - Day 94: 最长的斐波那契子序列的长度
java·数据结构·算法·leetcode·深度优先·动态规划
L_09076 小时前
【Algorithm】Day-11
c++·算法·leetcode
薛慕昭7 小时前
C语言核心技术深度解析:从内存管理到算法实现
c语言·开发语言·算法
.ZGR.7 小时前
第十六届蓝桥杯省赛 C 组——Java题解1(链表知识点)
java·算法·链表·蓝桥杯
近津薪荼7 小时前
每日一练 1(双指针)(单调性)
c++·算法
林太白7 小时前
八大数据结构
前端·后端·算法
爱思德学术7 小时前
第二届中欧科学家论坛暨第七届人工智能与先进制造国际会议(AIAM 2025)在德国海德堡成功举办
人工智能·算法·机器学习·语言模型
机器学习之心7 小时前
MATLAB多子种群混沌自适应哈里斯鹰算法优化BP神经网络回归预测
神经网络·算法·matlab
qq_479875438 小时前
C++ ODR
java·开发语言·c++
MicroTech20258 小时前
微算法科技(NASDAQ MLGO)“自适应委托权益证明DPoS”模型:重塑区块链治理新格局
科技·算法·区块链