Cod sursa(job #433875)

Utilizator ooctavTuchila Octavian ooctav Data 4 aprilie 2010 16:36:51
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>
#include <bitset>
using namespace std;
const int RNMAX = 1000010;
const int modulo = 9973;
int e[RNMAX], RAD = 0;
long long N;
int T;

void ciur()
{
	bitset<RNMAX> b;
	for(int i = 2 ; i * i< RNMAX ; i++)
		if(!b[i])
			for(int j = i * i ; j < RNMAX ; j += i)
				b[j] = 1;
			
	for(int i = 2 ; i <= RNMAX ; i++)
		if(!b[i])
			e[++RAD] = i;
}

int invmod(int a, int p)
{
	int rez = 1;
	for(; p ; p = p>>1)
	{
		if(p & 1)
			rez = (rez * a) % modulo , p--;
		a = (a * a) % modulo;
	}
	return rez;
}

void rezolva()
{
	long long n = N;
	int NR = 1, S = 1;
	for(int i = 1 ; e[i] * e[i] <= N ; i++)
		if(N % e[i] == 0)
		{
			int s = 1, d = 0;
			while(n % e[i] == 0)
			{
				n /= e[i];
				d++;
				s *= e[i];
			}
			NR *= d + 1;
			S = (S * (s * e[i] - 1)) % modulo;
			S = (S * invmod(e[i] - 1, modulo - 2)) % modulo;
		}
	if(n > 1)
	{
		NR *= 2;
		S = (S * (n * n - 1)) % modulo;
		S = (S * invmod(n - 1, modulo - 2)) % modulo;
	}
		
	printf("%d %d\n", NR, S);
}

int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	ciur();
	scanf("%d",&T);
	for(int i = 1 ; i <= T ; i++)
	{
		scanf("%lld",&N);
		rezolva();
	}
	
	return 0;
}