经典算法 约数之和

原题目链接

问题描述

假设现在有两个自然数 A 和 B,设 S 为 A^B 的所有约数之和。

请你计算:S mod 9901 的值。


输入格式

在一行中输入两个用空格隔开的整数 A 和 B。


输出格式

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


数据范围

  • 0 ≤ A, B ≤ 5 × 10^7
  • A 和 B 不会同时为 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
相关推荐
?abc!22 分钟前
(数组)448. 找到所有数组中消失的数字
算法
淡海水24 分钟前
05-03-源码-Boehm GC分配与碎片管理
开发语言·算法·unity·c#·游戏引擎·gc
努力实干26 分钟前
C++ 面向对象与工程架构
开发语言·c++·架构
代钦塔拉32 分钟前
【C++/Qt 进阶】设计模式系列(6):桥接模式——把“两个独立变化的维度“拆开
c++·qt·设计模式
青少儿编程课堂42 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C/C++考级:任意进制互转与大数多进制加法解析
c++·python·算法·bfs·信息学竞赛
Shadow(⊙o⊙)1 小时前
仿muduo实现高并发服务器——EPOLL设置与移除Poller.hpp管理Channel
运维·服务器·c++
闻缺陷则喜何志丹1 小时前
【C++特性及类库】多线程
开发语言·c++·多线程·语言特性·系统库
多弗朗皮卡丘1 小时前
C++ 哈希(下)
c++·算法·哈希算法
敲代码的苦131 小时前
头歌数据结构-排序的实现及其应用
数据结构
dtq04241 小时前
C++3 - 分支语句if和string变量
开发语言·c++·学习