Cod sursa(job #405902)

Utilizator FlorianFlorian Marcu Florian Data 28 februarie 2010 21:42:34
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
using namespace std;
#include<fstream>
const int MAX_N = 1000007, MOD = 9973;
int a[100007], P;
long long N;
bool u[MAX_N];
void ciur()
{
	int i,j; a[P = 1] = 2;
	for(i = 2; i < MAX_N; i+=2) u[i] = true;
	for(i = 3; i < MAX_N; i+=2)
		if(u[i] == false)
		{
			a[++P] = i;
			for(j = i + i; j < MAX_N; j+=i)
				u[j] = true;
		}
}
int po(long long a, int b)
{
	int rez = 1;
	while(b)
	{
		if(b&1)
		{
			rez = (rez * a) % MOD;
			b--;
		}
		else { a = (a * a) % MOD;b>>=1;}
	}
	return rez;
}
int main()
{
	ifstream in("ssnd.in"); ofstream out("ssnd.out");
	int T,i, r, nr; long long sol, tmp;
	in>>T;
	ciur();
	for(; T; --T)
	{
		in>>N; sol = 1, nr = 1;
		for(i = 1; a[i] * a[i] <= N; ++i)
		{
			for ( r = 0 ; N%a[i] == 0; ++r, N/=a[i]);
			if(r == 0) continue;
			nr *= (r + 1 );
			tmp = (((1LL*po(a[i], r + 1) - 1) % MOD)* 1LL * po( a[i] - 1, MOD - 2 ) % MOD ) % MOD;
			sol = (1LL*sol * tmp) % MOD;
		}
		if(N > 1)
		{
			r = 1;
			nr *= (r + 1 );
			tmp = (((1LL*po(N, r + 1) - 1) % MOD) * po( N - 1, MOD - 2 )*1LL % MOD ) % MOD;
			sol = (1LL*sol * tmp) % MOD;
		}
		out<<nr<<" "<<sol<<"\n";
	}
	return 0;
}