Cod sursa(job #536153)

Utilizator SheepBOYFelix Liviu SheepBOY Data 18 februarie 2011 12:30:06
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#define MAX 1000000
int nr,cr[1000001],prm[1000001];
void Ciur()
{
	int i,j;
	
	for(i=2;i<=MAX;++i)
		if(!cr[i])
			for(j=i+i;j<=MAX;j+=i)
				cr[j]=1;
	for(i=2;i<=MAX;++i)
		if(!cr[i])
			prm[nr++]=i;
}

int nrf,f[1000001],pwr[1000001],bff[1000000];

void Decompose(long long n)
{
	nrf=0;
	int i=0;
	pwr[0]=0;
	bff[0]=0;
	
	bool enter;
	
	while(n>1)
	{
		enter=0;
		while(!(n%prm[i]))
		{
			if(!pwr[nrf])
			{
				f[nrf]=prm[i];
				bff[nrf]=prm[i];
			}
			else
				bff[nrf]*=prm[i];
			
			pwr[nrf]++;
			n/=prm[i];
			
		enter=1;
		}
		
		if(enter)
			++nrf;
		
		++i;
	}
}
int main()
{
	int t;
	long long n;
	Ciur();
	
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	
	scanf("%lld",&t);
	int i,j,nrd;
	long long sum;
	while(t)
	{
		scanf("%lld",&n);
	
		Decompose(n);
		
		nrd=1;
		sum=1;
		for(i=0;i<nrf;++i)
		{
			nrd*=(pwr[i]+1);
			sum*=(bff[i]*f[i]-1)/(f[i]-1);
			sum%=9973;
		}
		
		printf("%d %lld\n",nrd,sum);
		--t;
	}
}