AcWing 97. 約數之和
寫在前面:AcWing是由北大一神級人物——“大雪菜” 創辦的算法交流社區, 裏面除了正常 oj 網站的功能之外, 還提供單人訓練、雙人匹配、雲端操作系統等模式,除此之外不定期舉行各種打卡活動,而且可以分享題解和心得,完全可以當成空間來玩。歡迎大家入坑。
點擊前往:AcWing
題目描述
假設現在有兩個自然數A和B,S是A^B的所有約數之和。
請你求出S mod 9901的值是多少。
輸入格式
在一行中輸入用空格隔開的兩個整數A和B。
輸出格式
輸出一個整數,代表S mod 9901的值。
數據範圍
0≤A,B≤5×10^7
輸入樣例
2 3
輸出樣例
15
解題思路
使用約數和定理求解
已過代碼
# include <iostream>
# include <algorithm>
# include <vector>
# include <stack>
# include <queue>
# include <string>
# include <sstream>
# include <cstdio>
# include <cstring>
# include <cmath>
# include <map>
# include <iomanip>
# include <bitset>
using namespace std;
typedef long long ll;
const int inf = 0x3f;
const int mod = 9901;
int qmi(int x, int k) {
x %= mod;
int ans = 1;
while (k) {
if (k & 1) {
ans = ans * x % mod;
}
x = x * x % mod;
k >>= 1;
}
return ans;
}
int sum(int p, int k) {
if (k == 0) {
return 1;
}
if (!(k & 1)) {
return (1 + p % mod*sum(p, k - 1)) % mod;
}
else {
return (1 + qmi(p, k / 2 + 1))*sum(p, k / 2) % mod;
}
}
int main() {
ios::sync_with_stdio(false);
int A, B;
cin >> A >> B;
int ans = 1;
for (int i = 2; i <= A; i++) {
int num = 0;
while (A%i == 0) {
num++;
A /= i;
}
if (num) {
ans = ans * sum(i, num*B) % mod;
}
}
if (!A) ans = 0;
cout << ans << endl;
return 0;
}