Cod sursa(job #527773)

Utilizator ioanabIoana Bica ioanab Data 1 februarie 2011 11:23:15
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>
using namespace std;

const int N=1000005;
bool c[N];
int v[N];


void ciur()
{
	int i,j,n;
	for(i=2;i*i<N;++i)
		if(!c[i])
			for(j=i*i;j<N;j+=i)
				c[j]=true;
	n=0;
	for(i=2;i<N;i++)
		if(c[i]==false)
			v[++n]=i;
}

long long Fast_pow(long long a, long long b)
{
	long long p;
	if(b==0)
		return 1;
	if(b==1)
		return a;
	p=Fast_pow(a,b/2);
	if(b%2==0)
		return (p * p);
	if(b%2==1)
		return ((p* p)*a);
	return 0;
}


int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	int t,i,k,p;
	long long suma,numar,n,m;
	scanf("%d",&t);
	ciur();
	m=9973;
	for(k=1;k<=t;k++)
	{
		scanf("%lld",&n);
		suma=1;
		numar=1;
		for(i=1;v[i]*v[i]<=n;++i)
			if(n%v[i]==0)
			{
				p=0;
				while(n%v[i]==0)
				{
					++p;
					n/=v[i];
				}
				suma=suma*(Fast_pow(v[i],p+1)-1)/(v[i]-1);
				suma=suma%m;
				numar=numar*(p+1);
			}
		if(n!=1)
		{
			suma=suma*(Fast_pow(n,2)-1)/(n-1);
			suma=suma%m;
			numar=numar*2;
		}
		printf("%lld %lld\n",numar,suma);
	}
	return 0;
}