AcWing 97. 約數之和

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;
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章