Cod sursa(job #3323165)

Utilizator Cezar2009Cezar Mihai Titihazan Cezar2009 Data 17 noiembrie 2025 13:03:16
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
//https://www.infoarena.ro/problema/sumdiv

//#pragma GCC optimize ("Ofast")
//#pragma GCC optimize ("fast-math")
//#pragma GCC optimize ("unroll-loops")
//#define _USE_MATH_DEFINES

#include <iostream>
#include <fstream>
//#include <vector>
//#include <cstring>
//#include <cmath>
//#include <bitset>
//#include <queue>
//#include <stack>
//#include <utility>
//#include <algorithm>
//#include <string>
//#include <map>
//#include <unordered_map>
//#include <set>
//#include <unordered_set>
//#include <cstdint>
//#include <climits>
//#include <iomanip>
//#include <cstdio>
//#include <tuple>

using namespace std;

ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");

const int MOD = 9901;

void euclid(int a, int b, int& x, int& y)
{
	if (b == 0)
	{
		x = 1;
		y = 0;
	}
	else
	{
		int x0, y0;
		euclid(b, a % b, x0, y0);
		x = y0;
		y = x0 - (a / b) * y0;
	}
}

int invMod(int x, int m)
{
	int x0, y0;
	euclid(x, m, x0, y0);
	return (x0 % m + m) % m;
}

int power_of_manyyy(int b, int e, int modulo)
{
	int rez = 1;

	while (e > 0)
	{
		if (e & 1)
			rez = ((int64_t)rez * b) % modulo;

		b = ((int64_t)b * b) % modulo;
		e >>= 1;
	}

	return rez;
}

int rezultat(int div, int exp)
{
	if (div % MOD == 0)
		return 1;
	if (div % MOD == 1)
		return exp + 1;

	return ((int64_t)((power_of_manyyy(div, exp + 1, MOD) + MOD) - 1) * invMod((div - 1), MOD)) % MOD;
}

int sumDiv(int b, int e)
{
	int rez = 1;

	for (int d = 2; d * d <= b; ++d)
	{
		if (b % d == 0)
		{
			int r = 0;
			while (b % d == 0)
			{
				++r;
				b /= d;
			}

			rez = ((int64_t)rez * rezultat(d, e * r)) % MOD;
			//cout << (power_of_manyyy(d, (e + 1), MOD) - 1) % MOD << " " << invMod((d - 1), MOD) << "\n";	
		}
	}

	if (b > 1)
	{
		rez = ((int64_t)rez * rezultat(b, e)) % MOD;
		//cout << (power_of_manyyy(b, (e + 1), MOD) - 1) % MOD << " " << invMod((b - 1), MOD) << "\n";
	}

	return rez;
}

signed main()
{
	//ios_base::sync_with_stdio(false);
	//cin.tie(nullptr);
	//cout.tie(nullptr);

	int a, b;

	fin >> a >> b;

	fout << sumDiv(a, b);

	return 0;
}