Cod sursa(job #406475)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 1 martie 2010 16:02:04
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>
#include<string.h>
#define Ld 1000000
#define MOD 9973
#define divizori 80000
using namespace std;
int t,T,i,n,prim[divizori],ciur[Ld+1],P,d[divizori],D,exp[divizori],put[divizori],Nr,S;


void precalc()
{
	int i,j;
	
	for(i=2;i<=Ld;i++)
		if(!ciur[i])
		{
			prim[++P]=i;
			for(j=i+i;j<=Ld;j+=i)
				ciur[j]=1;
		}
}

int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	
	scanf("%d",&T);
	
	precalc();
	
	for(t=1;t<=T;t++)
	{
		scanf("%d",&n);
		D=0;
		memset(exp,0,sizeof(exp));
		memset(put,0,sizeof(put));
		for(i=1; i<=P && prim[i]<=n && n!=1; i++)
			if(n%prim[i]==0)
			{
				d[++D]=prim[i];
				put[D]=prim[i];
				while(n%prim[i]==0)
				{
					exp[D]++;
					put[D]=(put[D]*prim[i])%MOD;
					
					n/=prim[i];
				}
			}
		if(n!=1) { d[++D]=n; exp[D]=1; put[D]=(n*n)%MOD;}
		
		Nr=1;
		for(i=1;i<=D;i++)
			Nr*=(exp[i]+1);
		
		S=1;
		for(i=1;i<=D;i++)
			S= ( S* (put[i]-1)/(d[i]-1) ) %MOD;
			
		printf("%d %d\n",Nr,S);
	}
	return 0;
}