Cod sursa(job #658893)

Utilizator cremarencodianaCremarenco Diana cremarencodiana Data 9 ianuarie 2012 19:20:11
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 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;  y=x;
				while (y%p[i]==0)
				{
					nr++;
					y/=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 (ok==false) printf("%d %d\n",2,x+1);
		else
		printf("%d %d\n",prod, suma);
	}
	return 0;
		
}