经典算法 约数之和

原题目链接

问题描述

假设现在有两个自然数 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
相关推荐
代码游侠27 分钟前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
想进个大厂31 分钟前
代码随想录day37动态规划part05
算法
sali-tec31 分钟前
C# 基于OpenCv的视觉工作流-章22-Harris角点
图像处理·人工智能·opencv·算法·计算机视觉
子春一41 分钟前
Flutter for OpenHarmony:构建一个 Flutter 四色猜谜游戏,深入解析密码逻辑、反馈算法与经典益智游戏重构
算法·flutter·游戏
MZ_ZXD0011 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
人道领域1 小时前
AI抢人大战:谁在收割你的红包
大数据·人工智能·算法
TracyCoder1231 小时前
LeetCode Hot100(34/100)——98. 验证二叉搜索树
算法·leetcode
A尘埃1 小时前
电信运营商用户分群与精准运营(K-Means聚类)
算法·kmeans·聚类
A星空1232 小时前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c
凡人叶枫2 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发