Cod sursa(job #1412736)

Utilizator ArkinyStoica Alex Arkiny Data 1 aprilie 2015 14:42:07
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>

#define MAX 1000010

long long n,pr;
int nd;
bool V[MAX];

int T[MAX/2],t;


long long inline pow(long long x,int p)
{
   long long pr=1;
	while(p!=1)
	{
		if(p%2==0)
		{
			x=(1LL*x*x);
			p=p/2;
		}
		else
		{
		   pr=(pr*x);
		   p=p-1;
		}
	}
	return (pr*x);
}

int main()
{
	FILE *in,*out;
	in=fopen("ssnd.in","r");
	out=fopen("ssnd.out","w");
	fscanf(in,"%d",&t);
	int i,j;

	int nx=0;
	for(i=2;i<=MAX;i++)
	{
		if(V[i]==0)
		{
		  T[++nx]=i;
		  for(j=i;j<=MAX/i;j++)
				   V[i*j]=1;
		}
	}
	int nr=1;
	long long s=1;
	for(int k=1;k<=t;k++)
	{
		fscanf(in,"%lld",&n);
		nr=1;
		s=1;
		for(j=1;j<=nx && 1LL*T[j]*T[j]<=n;j++)
		{
					pr=1,nd=0;
					while(n!=1 && n%T[j]==0)
					{
						nd++;
						n=n/T[j];
				
		            };
			  nr=nr * (nd+1);
			  s=(s* (pow(1LL*T[j],nd+1)-1)/(T[j]-1))%9973;
		}
		if(n>1)
		{
			nr=nr *2;
			s=(s*((n*n)-1)/(n-1))%9973;
		}
		fprintf(out,"%d %d\n",nr,s);
	}
	fclose(in);
	fclose(out);
	return 0;
}