Cod sursa(job #2836784)

Utilizator siliviuSilion Liviu siliviu Data 20 ianuarie 2022 21:24:21
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <bits/stdc++.h>

using namespace std;

int main() {
	ifstream cin("sumdiv.in");
	ofstream cout("sumdiv.out");
	const int mod = 9901;
		auto pow = [&](int b, int e) {
		int ans = 1;
		while (e) {
			if (e & 1)
				ans = 1LL * ans * b % mod;
			b = 1LL * b * b % mod, e >>= 1;
		}
		return ans;
	};
	int ans = 1;
	long long a, b;
	cin >> a >> b;
	vector<pair<int, int>> d;
	int p2 = __builtin_ctzll(a);
	if (p2)
		d.emplace_back(2, 1LL * p2 * (b % (mod - 1)) % (mod - 1));
	a >>= p2;
	int ub = sqrt(a);
	for (int i = 3;i <= ub && a != 1;i += 2) {
		int cur = 0;
		while (!(a % i))
			a /= i, ++cur;
		if (cur)
			d.emplace_back(i % mod, 1LL * cur * (b % (mod - 1)) % (mod - 1));
	}
	if (a != 1)
		d.emplace_back(a % mod, b);
	for (auto x : d) {
		if (x.first == 1)
			ans = 1LL * ans * (x.second % mod + 1) % mod;
		else
			ans = 1LL * ans * (pow(x.first, x.second + 1) - 1) % mod * pow(x.first - 1, mod - 2) % mod;
	}
	cout << ans;
}