Cod sursa(job #412109)

Utilizator funkydvdIancu David Traian funkydvd Data 5 martie 2010 12:52:36
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
using namespace std;
const int MAX_N = 1000005;
const int MOD = 9973;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");
long long N;
int T, P[MAX_N], K;
char viz[MAX_N];
void ciur()
{
	for(int i = 2; i < MAX_N; ++i)
		if(viz[i] == 0)
		{
			P[++K] = i;
                        for(int j = i+i; j < MAX_N; j += i) viz[j] = 1;
		}
}
inline int pow(int x, int p)
{
	int rez = 1;
	x %= MOD;
	for(; p; p >>= 1)
	{
		if(p & 1) rez *= x,
		rez %= MOD;
		x *= x;
		x %= MOD;
	}
	return rez;
}
void solve()
{
	fin >> N;
	int nd = 1, sd = 1;
	long long n = N;
	for(int i = 1; 1LL * P[i] * P[i] <= N; ++i)
	{
		if(N % P[i]) continue;
		int p = 0, s = 1;
		while(n % P[i] == 0)
			n /= P[i], s *= P[i], ++p;
		
		nd *= (p+1);
		sd *= ((1LL*s*P[i] - 1) % MOD);
		sd %= MOD;
		sd *= pow(P[i]-1, MOD-2);
		sd %= MOD;
	}

	if(n > 1)
	{
		nd *= 2;
		sd *= ((1LL*n*n - 1) % MOD);
		sd %= MOD;
		sd *= pow(n-1, MOD-2);
		sd %= MOD;
	}

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

int main()
{
	ciur();
	for(fin >> T; T; --T) solve();
	return 0;
}