Cod sursa(job #1721031)

Utilizator valentin50517Vozian Valentin valentin50517 Data 24 iunie 2016 07:39:03
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool B[10100];
ll T,P[7000],p,D[7000],R[7000],x,y,r;
ll const m = 9901;
ll put(ll num,ll e,ll mod){
	if(e <= 0) return 1;
	ll rs = put(num,e/2,mod);
	return (((rs*rs)%mod)*(e%2==1 ? num : 1))%mod+mod;
}
ll inv(ll num,ll mod){
	return put(num,mod-2,mod)+mod;
}

int main(){
	ifstream cin("sumdiv.in");
	ofstream cout("sumdiv.out");
	for(int i = 2;i<=10000;i++)
		if(!B[i]) for(int j = i+i;j<=10000;j+=i) B[j] = 1;
	for(int i = 2;i<=10000;i++) if(!B[i]) P[p++] = i;
	cin >> x >> y;
	if(x == 0) return cout << 0,0;
	if(x == 1 || y == 0) return cout << 1,0;
	int i = 0;
	r = 0;
	while(x>1 && i < p && P[i]*P[i] <= x){
		 while(i<p && P[i]*P[i] <= x && x%P[i] != 0) i++;
		 if(i<p && P[i]*P[i] <= x){
			 D[++r] = P[i];
			 R[r] = 0;
			 while(x%D[r] == 0) R[r]++,x/=D[r];
		}
	}
	if(x > 1) D[++r] = x,R[r] = 1;
	ll sum = 1;
	for(int i = 1;i<=r;i++) R[i]*=y;
	for(int i = 1;i<=r;i++) sum=(((put(D[i],R[i]+1,m)-1)*inv(D[i]-1,m)%m)*sum)%m;
	cout << sum << '\n';

	return 0;
}