Cod sursa(job #3121635)

Utilizator daristyleBejan Darius-Ramon daristyle Data 14 aprilie 2023 15:16:00
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <fstream>

using namespace std;

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

const int MOD = 9901;

int lgput(int b, int e, int mod) {
	int pow = 1;
	b %= mod;
	while(e){
		if(e & 1)
			pow = (pow * b) % mod;
		b = (b * b) % mod;
		e >>= 1;
	}

	return pow;
}

int invmod(int a, int mod) {
	return lgput(a, mod - 2, mod);
}

int main() {
	int a, b;
	fin >> a >> b;
	while(a % MOD == 0)
		a /= MOD;
	int sum_div = 1, d = 3, p = 0;
	while(!(a & 1)){
		a >>= 1;
		++p;
	}
	if(p){
		sum_div = sum_div * (lgput(2, b * p + 1, MOD) + MOD - 1) % MOD;
		sum_div = sum_div * invmod(1, MOD) % MOD;
	}

	while(d * d <= a){
		p = 0;
		while(a % d == 0){
			a /= d;
			++p;
		}
		if(p)
			sum_div = sum_div * (lgput(d, p * b + 1, MOD) + MOD - 1) % MOD * invmod(d - 1, MOD) % MOD;

		d += 2;
	}

	if(a > 1)
		sum_div = sum_div * (lgput(a, 1 * b + 1, MOD) + MOD - 1) % MOD * invmod(a - 1, MOD) % MOD;

	fout << sum_div << '\n';

	fin.close();
	fout.close();
	return 0;
}