Cod sursa(job #2098436)

Utilizator flibiaVisanu Cristian flibia Data 2 ianuarie 2018 20:00:27
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <bits/stdc++.h>
#define ll long long 
#define mod 9901
#define N 7075

using namespace std;

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

ll nr, p, sum, cnt;
vector <pair <ll, ll> > v;
vector <ll> primes;
bool viz[N + 3];

void precalc(){
	for(int i = 2; i <= N; i++)
		if(!viz[i]){
			primes.push_back(i);
			for(int j = i + i; j <= N; j += i)
				viz[j] = 1; 
		}
}

void mul(ll &nr, ll val){
	nr = (nr * val) % mod;
}

ll lgput(ll a, ll p){
	a %= mod;
	ll rs = 1;
	while(p){
		if(p & 1)
			mul(rs, a);
		mul(a, a);
		p /= 2;
	}
	return rs;
}

void solve(){
	in >> nr >> p;
	sum = 1;
	for(auto dv : primes){
		if(dv * dv > nr)
			break;
		cnt = 0;
		while(nr % dv == 0)
			cnt++, nr /= dv;
		if(cnt)
			v.push_back({dv, cnt});
	}
	if(nr > 1)
		v.push_back({nr, 1});
	for(auto i : v){
		if(i.first % mod == 1){
			mul(sum, p + 1);
			continue;
		}
		mul(sum, lgput(i.first, i.second * p + 1) - 1);
		mul(sum, lgput(i.first - 1, mod - 2));
		while(sum < 0)
			sum += mod;
	}
	out << sum;
}

int main(){ 
	precalc();
	solve();
	return 0;
}