Cod sursa(job #981468)

Utilizator bugyBogdan Vlad bugy Data 7 august 2013 11:29:18
Problema Sum Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <math.h>
#define dim 100005
using namespace std;

int n,i,j,MAX,Mark[dim],v[dim],phi[dim],p,putere,rez;

void read()
{
	FILE *f = fopen("sum.in","r");
	
	fscanf(f,"%d",&n);
	for( i = 1; i <= n; i++ )
	{
		fscanf(f,"%d",&v[i]);
		if( v[i] > MAX )
			MAX = v[i];		
	}
	fclose(f);
}

void ciur()
{	
	for( i = 2; i <= sqrt(MAX); i++ )
		if( Mark[i] == 0)
			for( j = 2; (i*j) <= MAX; j++ )
				Mark[i*j] = 1;		
	//Daca Mark[i] == 0, e prim.
}

void function_phi()
{
	phi[1] = 1;
	
	for( i = 2; i <= MAX; i++)
		if( Mark[i] == 0 )
			phi[i] = i-1;
		else
		{
			p = i;
			rez = 1;
			
			for( j = 2; j <= i/2; j++)
			{
				putere = 1;
				while(p % j == 0)
				{
					p /= j;
					putere *= j;
				}
				if(putere != 1)
					rez *= ((j-1)*(putere/j));
			}
					
			phi[i] = rez; 
		}
}

void write()
{
	FILE *g = fopen("sum.out","w");
	
	for( i = 1; i <= n;  i++ )
		fprintf( g,"%lld\n",(long long) (2 * phi[v[i]] * v[i]));
	fclose(g);
}

int main()
{
	read();
	ciur();
	function_phi();
	write();

return 0;
}