约数之和

https://www.acwing.com/problem/content/99/

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

请你求出S mod 9901的值是多少。

输入格式

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

输出格式

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

数据范围

0A,B5×107,0≤A,B≤5×107

输入样例:

2 3

输出样例:

15

注意: A和B不会同时为0。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int p = 9901;
int a,b;
int power(int a,int b){
    int ans = 1 % p;
    for(;b;b>>=1){
        if(b & 1) ans = ans * a % p;
        a = a * a % p;
    }
    return ans;
}
int sum(int z,int c){
    if(!c) return 1;
    if(c & 1)
        return (1 + power(z,(c + 1) >> 1)) * sum(z,(c - 1) >> 1) % p;
    return ((1 + power(z,c >> 1)) * sum(z,(c >> 1) - 1) % p + power(z,c)) % p;
}
signed main(){
   // freopen("in","r",stdin);
    ios::sync_with_stdio(0);
    cin >> a >> b;
    int ans = 1;
    for(int i = 2; i <= a; i++){
        int s = 0;
        while (a % i == 0){
            s++;
            a /= i;
        }
        if(s) ans = ans * sum(i,s*b) % p;
    }
    if(!a) ans = 0;
    cout << ans;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/xcfxcf/p/12350498.html