Cod sursa(job #620340)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 16 octombrie 2011 13:40:20
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>

const int NMAX = 1000005;
const int MOD = 9973;

int nrPrime, prime[NMAX], viz[NMAX];

void ciur();

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;
}

int main()
{
	int p, t, d, sd, p1, p2, i;
	long long n; 
	freopen("ssnd.in", "r", stdin);
	freopen("ssnd.out", "w", stdout);
	ciur();
	scanf("%d", &t);
	for (; t>0; t--)
	{
		scanf("%lld", &n);
		i=1;
		d=1;
		sd=1;/////
		while ((i<=nrPrime) && (1LL*prime[i]*prime[i]<=n))
		{
			p=0;
			while ((n%prime[i])==0)
			{
				n/=prime[i];
				p++;
			}//while
			d*=p+1;
			p1 = (pow(prime[i], p+1) - 1) % MOD;////
			p2 = pow(prime[i]-1, MOD-2) % MOD;///
			sd = (((sd * p1) % MOD) * p2) % MOD;////
			i++;
		}//while i
		if (n>1)
		{
			d*=2;
			sd = (1LL*sd*(n+1) % MOD);
		}//if
		printf("%d %d\n", d, sd);
	}//for t
	return 0;
}//main

void ciur()
{
	int i, j;
	nrPrime=0;
	for (i=2; i<NMAX; i++)
	{
		if (viz[i]==0)
		{
			prime[++nrPrime]=i;
			for (j=i+1; j<NMAX; j+=i)
				viz[j]=1;
		}//if
	}//for i
}//ciur