Cod sursa(job #69642)

Utilizator cos_minBondane Cosmin cos_min Data 3 iulie 2007 19:24:33
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#include <vector>
using namespace std;

#define in "fractii.in"
#define out "fractii.out"

int N, j, r;
int S[21], G[21]; 
bool ok[1000000];
int phi[1000000];
vector<int> V;

int Solve(int);

int main()
{
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d", &N);
    
    for ( int i = 1; i <= N; i++ )
        ok[i] = 0;
    
    for ( int i = 2; i <= N; i++ )
    {
        j = 2;
        while ( i*j <= N )
        {
              ok[i*j] = 1;
              j++; 
        }
    } 
    
    for ( int i = 2; i <= N; i++ )
        if ( ok[i] == 0 )
        {
             phi[i] = i-1;
             V.push_back(i);
        }
    
    int total=0;
    
    for ( int i = 1; i <= N; i++ )
    {
        if ( ok[i] == 1 ) phi[i] = Solve(i);
        total += phi[i];
    } 
    
    printf("%d", 2*total+1);
}

int Solve(int t)
{
    r = 0;
    int Q = t;
    for ( int i = 0; i < V.size() && t > 1; i++ )
    {
        if ( t % V[i] == 0 ) r+=1, S[r] = V[i]-1, G[r] = V[i];
        while ( t % V[i] == 0 ) t /= V[i];
    }
    
    for ( int i = 1; i <= r; i++ )
    {
        Q /= G[i];
    }
    
    for ( int i = 1; i <= r; i++ )
    {
        Q *= S[i];
    }
    
    return Q;
}