Cod sursa(job #1721020)

Utilizator valentin50517Vozian Valentin valentin50517 Data 24 iunie 2016 06:43:08
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool B[1000100];
ll T,P[80000],p,D[80000],R[80000],x,r;
ll const m = 9973;
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;
}
ll inv(ll num,ll mod){
	return put(num,mod-2,mod);
}

int main(){
	ifstream cin("ssnd.in");
	ofstream cout("ssnd.out");
	for(int i = 2;i<=1000000;i++)
		if(!B[i]) for(int j = i+i;j<=1000000;j+=i) B[j] = 1;
	for(int i = 2;i<=1000000;i++) if(!B[i]) P[p++] = i;
	cin >> T;
	while(T--){
		cin >> x;
		int i = 0;
		r = 0;
		while(x>1 && P[i] <= sqrt(x)+1){
			 while(x%P[i] != 0 && P[i] <= sqrt(x)+1 && i<p) i++;
			 if(P[i] > sqrt(x) || p == i) break;
			 D[++r] = P[i];
			 R[r] = 0;
			 while(x%D[r] == 0) R[r]++,x/=D[r];
		}
		if(x != 1) D[++r] = P[i],R[r] = 1;
		ll num=1,sum = 1;
		for(int i = 1;i<=r;i++) num=(num*(R[i]+1))%m;
		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 << num << ' ' << sum << '\n';
	}
	return 0;
}