Cod sursa(job #481731)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 1 septembrie 2010 15:34:41
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <vector>
using namespace std;

typedef long long i64;
const int SQRT_B=1000005;
const int MOD=9973;

#define pb push_back

bool prim[SQRT_B];
vector<int> Primes;

void eratostene()
{
	int i,j;
	for (i=0;i<SQRT_B;++i) prim[i]=true;
	prim[0]=prim[1]=false;
	for (i=2;i<SQRT_B;++i)
		if (prim[i])
			for (j=i*2;j<SQRT_B;j+=i) prim[j]=false;

	Primes.reserve(200000);	
	for (i=2;i<SQRT_B;++i) 
		if (prim[i]) Primes.pb(i);
}

int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	int T;
	i64 N;
	scanf("%d",&T);
	eratostene();
	while (T--)
	{
		scanf("%lld",&N);
		if (N==1) { printf("1 1\n"); continue; }
		int nr_div=1, sum_div=1;
		for (vector<int>::iterator it=Primes.begin();it!=Primes.end();++it)
		{
			if ((i64) *it * *it > N) break;
			if (N % *it == 0)
			{
				int exp=0;
				while (N % *it == 0) N/= *it, ++exp;
				nr_div*=(exp+1);
				int sum=0;
				for (int x=1,j=0;j<=exp;++j,x=(x* *it)%MOD)
					sum=(sum+x)%MOD;
				sum_div=(sum_div*sum)%MOD;
			}
		}
		if (N > 1)
		{
			nr_div*=2;
			sum_div=(sum_div*(1+N))%MOD;
		}
		printf("%d %d\n",nr_div,sum_div);
	}

	return 0;
}