Cod sursa(job #1547692)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 9 decembrie 2015 19:10:15
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#include <vector>
using namespace std;
using ll = long long;
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define MOD 9901
#define Vmax 7100

vector< bool > isPrime(Vmax, true);
vector< int > prim;

int putere(int, int) ;

int main()
{
    ifstream fin("sumdiv.in");
    ofstream fout("sumdiv.out");
    
    int i, j, a, b, exp, rez, factor;
    
    prim.pb(2);
    for(i = 3; i < Vmax; i += 2)
	{
		while(!isPrime[i] && i < Vmax) i += 2;
		if(i < Vmax) prim.pb(i);
		for(j = i * i; j < Vmax; j += i + i) isPrime[j] = false;
	}
    
    fin >> a >> b;
    
    rez = 1;
    for(auto it = prim.begin(); it != prim.end() && (*it) * (*it) <= a; ++it)
		if(a % (*it) == 0)
	{
		for(exp = 0; a % (*it) == 0; ++exp) a /= (*it);
		
		factor = putere(*it, exp * b + 1);
		if(factor) --factor;
		else factor = MOD - 1;
		
		factor = (factor * putere((*it) - 1, MOD - 2)) % MOD;
		
		rez = (rez * factor) % MOD;
	}
	
	if(a)
	{
		factor = putere(a, b + 1);
		if(factor) --factor;
		else factor = MOD - 1;
		
		factor = (factor * putere(a - 1, MOD - 2)) % MOD;
		
		rez = (rez * factor) % MOD;
	}
	
	fout << rez << '\n';
	
    return 0;
}

int putere(int baza, int exp)
{
	int rez;
	
	for(rez = 1; exp; exp >>= 1)
	{
		if(exp & 1) rez = (rez * baza) % MOD;
		baza = (baza * baza) % MOD;
	}
	return rez;
}