Cod sursa(job #533434)

Utilizator SadmannCornigeanu Calin Sadmann Data 13 februarie 2011 22:20:49
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<stdio.h>
#include<vector>
#include<math.h>
using namespace std;
int cmmdc(int a,int b)
{
    while(b)
    {
        int r=a%b;
        a=b;
        b=r;
    }
    return a;
}


FILE *in,*out;
int N,cntprim,i,j,nr,contscad;
double euler;
int main()
{
    in=fopen("fractii.in","rt");
    out=fopen("fractii.out","wt");
    fscanf(in,"%d",&N);
	vector<bool> primviz(N+1);
	vector<double> totprim(N+1);
	vector<double> scadere(N+1);
	euler=1;
	for(i=2;i<=N;i++)
	{
		if(!primviz[i])
		{
			euler+=2*(i-1);
			for(j=i<<1;j<=N;j+=i)
			{
				primviz[j]=true;
				if(scadere[j]>1)
					nr=j/scadere[j];
				else
				{
					nr=j;
					scadere[j]=1;
				}
				contscad=0;
				if(!totprim[j])
					totprim[j]=j;
				while( !(nr%i) && nr>1 )
				{
					nr/=i;
					contscad++;
				}
				if(nr<=1)
				{
					euler+=2*(totprim[j]-totprim[j]/i);
					totprim[j]=0;
				}
				else
				{
					totprim[j]=totprim[j]-totprim[j]/i;
					scadere[j]*=pow(i,contscad);
				}
			}
		}
	}
	fprintf(out,"%.0lf",euler);
	
    return 0;
}