Cod sursa(job #672445)

Utilizator raduiris94Alexa Radu raduiris94 Data 2 februarie 2012 10:32:14
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>
#include <bitset>
#define DN 1000005
#define MOD 9973
using namespace std;
long long N;
int T, K, P[DN];
bitset<DN>viz;
void ciur() 
{
	for(int i=2; i <DN; ++i) 
	{
		if(viz[i]==0) 
		{
			P[++K]=i;
			for(int j=i+i; j<DN; j+=i)
				viz[j] = 1;
		}
	}
}
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;
}
int main() 
{
	freopen ("ssnd.in", "r", stdin);
	freopen ("ssnd.out", "w", stdout);
	ciur();
	for(scanf("%d", &T); T; --T)
	{
		scanf("%d", &N);
		int	nd = 1, sd = 1;
		for(int i=1; i<=K&&1LL*P[i]*P[i]<=N; ++i) 
		{
			if(N % P[i]) continue;
			int p = 0;
			while(N % P[i] == 0) 
			{
				N /= P[i];
				++p;
			}
			nd *= (p+1);
			int p1=(pow(P[i], p+1) - 1)%MOD;
			int p2=pow(P[i]-1, MOD-2)%MOD;
			sd=(((sd * p1) % MOD) * p2)%MOD;
		}
		if(N>1) 
		{
			nd*=2;
			sd=(1LL*sd*(N+1)%MOD);
		}
		printf("%d %d\n", nd, sd);
	}
}