Cod sursa(job #487900)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 26 septembrie 2010 20:29:31
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream>
#include<cstring>

using namespace std;

const int DIM = 1000005;

const int MOD = 9973;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

long long N;
int T, K, P[DIM];
char ciur[DIM];

void erast() {
	int i, j;
	for(i=2; i<DIM; i++) {
		if(ciur[i]==0) {
			P[++K]=i;
			for(j=i*2; j<DIM; j+=i) 
				ciur[j]=1;
		}
	}
}

inline int pow(int x, int p) {
	int sol=1;
	x%=MOD;
	for(; p; p/=2) {
		if(p%2==1) 
			sol*=x, sol%=MOD;
		x*=x, x%=MOD;
	}
	return sol;
}

void solve() {
	fin >> N;

	int	i, p, p1, p2, nd=1, sd=1;

	for(i=1; i<=K && P[i] * P[i] <= N; i++) {
		if(N%P[i]) 
			continue;
		p=0;
		while(N%P[i]==0) {
			N/=P[i];
			++p;
		}
		
		nd*=(p+1);
		
		p1 =(pow(P[i], p+1) - 1) % MOD;
		p2 =(pow(P[i]-1, MOD-2) % MOD;
		
		sd = (((sd * p1) % MOD) * p2) % MOD;
	}

	if(N > 1) {
		nd *= 2;
		sd = (sd*(N+1) % MOD);
	}

	fout << nd << " " << sd << "\n";
}

int main() {
	erast();

	for(fin >> T; T; --T)
		solve();
}