Cod sursa(job #658939)

Utilizator cremarencodianaCremarenco Diana cremarencodiana Data 9 ianuarie 2012 20:21:23
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
# include <stdio.h>
#include<math.h>
int p[1000005],i,j,k,x,suma,prod,n,t,nr,y,z,q,nr1,s;
bool viz[1000005],ok;
long long int a,b,aux;
int pow1(long long int a, long long int b)
{
	long long int aux;
	if (b==0) return 1;
	else
		if (b%2==0)
		{
			aux=pow1(a,b/2);
			return (aux*aux)%1973;
		}
		else
			return (a*pow1(a,b-1))%1973;
}
int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	scanf("%d\n",&n);
	k=0;
	p[++k]=2;
	for (i=3; i<=1000005; i+=2)
		if (viz[i]==false)
		{
			p[++k]=i;
			for (j=3*i; j<=1000005; j+=2*i)
				viz[j]=true;
		}
	for (t=1; t<=n; t++)
	{
		scanf("%d\n",&x);
		ok=false;
		i=1; suma=1; prod=1; s=x;
		while (p[i]<=sqrt(x))
		{
			if (x%p[i]==0)
			{
				ok=true;
				nr=1;
				while (x%p[i]==0)
				{
					nr++;
					x/=p[i];
				}
				prod=(prod*nr)%1973;
				z=p[i]; q=nr;
				y=pow1(z,q);
				suma=(suma*((y-1)/(p[i]-1)))%1973;
			}
			i++;
		}
		if (x!=1)
			{prod=(prod*2)%1973;
		suma=(suma*((x*x-1)/(x-1)))%1973;}
		printf("%d %d\n",prod,suma);
	}
	return 0;
		
}