Cod sursa(job #87220)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 26 septembrie 2007 20:59:39
Problema Sum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
# include <stdio.h>

const long int MAXN=100000;

long int task[MAXN+1],n,ciur[MAXN],ciurlen;

void citire()
{
FILE *f=fopen("sum.in","r");
fscanf(f,"%ld",&n);
long int i;
for (i=1;i<=n;i++)
	fscanf(f,"%ld",&task[i]);
fclose(f);
}

void det_primes()
{
long int prim,i,j;
float bound;
ciur[1]=2;ciurlen=1;
for (i=2;i<=50000;i++)
	{
	prim=1;
	bound=sqrt(i)+1;
	for (j=1;j<=ciurlen&&prim&&ciur[j]<=bound;j++)
		if (i%ciur[j]==0) prim=0;
	if (prim) ciur[++ciurlen]=i;
	}
}

long int sigma(long int a) {return a*(a+1)/2;}
long int sign(long int a) {if (a%2==1) return -1; return 1;}

void calculeaza()
{
long int qwd,aux,iaux,nrc,i,siaux,coef,facts[10],factslen=0;
long long int solloc;
FILE *g=fopen("sum.out","w");
for (qwd=1;qwd<=n;qwd++)
	{
	aux=task[qwd];
	iaux=1;
	factslen=0;
	while (aux!=1)
		{
		if (aux%ciur[iaux]==0)
			{
			facts[++factslen]=ciur[iaux];
			while (aux%ciur[iaux]==0) aux/=ciur[iaux];
			}
		iaux++;
		}
	//avem in factslen descompunerea in factori. acuma sa facem
	//includerea si excluderea
	solloc=0;
	for (iaux=1;iaux<=(1<<factslen)-1;iaux++)
		{
		siaux=iaux;
		//sa determinam coeficientii
		for (nrc=0,i=1,coef=1;i<=factslen;i++,siaux/=2)
			if (siaux%2==1)
				{
				coef*=facts[i];
				nrc++;
				}
		solloc+=sign(nrc)*coef*sigma(2*task[qwd]/coef);
		}
	solloc+=sigma(2*task[qwd]);
	fprintf(g,"%lld\n",solloc);
	}
fcloseall();
}

int main()
{
citire();
//determinam toate numerele prime pana la 320
det_primes();
calculeaza();
return 0;
}