Cod sursa(job #92316)

Utilizator recviemAlexandru Pana recviem Data 14 octombrie 2007 22:12:04
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <stdio.h>
#include <string.h>
using namespace std;

	bool prim[1000000];
    int n;
	long long sum;

void citire()
{
    freopen("fractii.in","r",stdin);
    scanf("%d",&n);
}

long long totient(int x)
{
    float rez=x;
	if (prim[x]) return (x-1);
	else
	{
	    if ( x % 2 == 0) rez = rez / 2;
        for(int i=3;i<=x/2;i+=2)
        if (prim[i] && x % i ==0)
            rez=rez-rez/i;
	}
	return rez;
}

void ciur()
{
    memset(prim,true,sizeof(prim));
    prim[2]=true;
    for (int i=4;i<1000000;i+=2)
        prim[i]=false;
	for (int i=3;i<1000000;i+=2)
	{
		if (prim[i])
		for(int j=2*i;j<1000000;j+=i)
			prim[j]=false;
	}
}

void scrie()
{
    freopen("fractii.out","w",stdout);
    printf("%lld",sum);
    fclose(stdout);
}

int main()
{
    citire();
    sum = 1;
	ciur();
    for (int i=2;i<=n;i++)
        sum += 2*totient(i);
    scrie();
    //printf("%d",totient(4));
    return 0;
}