Cod sursa(job #1089940)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 22 ianuarie 2014 08:27:51
Problema Suma divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <fstream>
#define MOD 9901
using namespace std;
int A, B, sol = 1;

inline int LgPut(int baz, int put)
{
	int p = 1;
	while(put > 0)
	{
		if(put % 2 == 1)
		{
			p = (1LL * p * baz) % MOD;
			put--;
		}
		baz = (1LL * baz * baz) % MOD;
		put /= 2;
	}
	return p;
}

int main()
{
	int i, Exp = 0, aux;
	ifstream fin("sumdiv.in");
	fin >> A >> B;
	fin.close();
	
	if(A % 2 == 0)
	{
		while(A % 2 == 0)
		{
			Exp++;
			A /= 2;
		}
		Exp *= B;
		sol = (1LL * (LgPut(2, Exp + 1) - 1 + MOD) * LgPut(2 - 1, MOD - 2)) % MOD;
	}
	for(i = 3; i * i <= A; i += 2)
	{
		if(A % i == 0)
		{
			Exp = 0;
			while(A % i == 0)
			{
				Exp++;
				A /= i;
			}
			Exp *= B;
			aux = (1LL * (LgPut(i, Exp + 1) - 1 + MOD) * LgPut(i - 1, MOD - 2)) % MOD;
			sol = (1LL * sol * aux) % MOD;
		}
	}
	
	ofstream fout("sumdiv.out");
	fout << sol << "\n";
	fout.close();
	return 0;
}