Cod sursa(job #1795579)

Utilizator Coroian_DavidCoroian David Coroian_David Data 2 noiembrie 2016 17:52:06
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>

#include <cstdio>

using namespace std;

FILE *f, *g;

int n;

struct numere
{
    int sum;
    int prod = 1;
    int euler;
};

numere e[1000001];

int rez;

void ciur()
{
    int i, j;

  //  e[1].sum = e[1].prod = 1;

    for(i = 1; i <= n; i ++)
        e[i].euler = i;

    for(i = 2; i <= n; i += 2)
    {
        e[i].euler /= 2;

        e[i].sum = 2;

        e[i].prod = 2;
    }

    for(i = 3; i <= n; i += 2)
    {
        if (e[i].euler == i)
            for(j = i; j <= n; j += i)
            {
                e[j].euler = e[j].euler / i * (i - 1);

                e[j].sum += i;

                e[j].prod *= i;

            }
    }

   /* for(i = 1; i <= n; i ++)
        printf("*%d ", e[i]);*/
}

void readFile()
{
    f = fopen("fractii.in", "r");

    fscanf(f, "%d", &n);

    fclose(f);
}

void solve()
{
    int i;

  //  printf("%d %d\n", n, e[n].euler);

   // rez = e[n].euler;

   rez = 1 + e[n].euler * 2;

    for(i = 2; i < n; i ++)
    {
       /* printf("%d\n", rez);

        rez += e[i].euler;

        printf("%d\n", rez);

        int x = n - i;

        rez += (x - (x * e[i].sum / e[i].prod));

        printf("%d\n", rez);*/

        rez += e[i].euler * 2;
    }
}

void printFile()
{
    g = fopen("fractii.out", "w");

    fprintf(g, "%d\n", rez);

    fclose(g);
}

int main()
{


    readFile();

        ciur();

    solve();

    printFile();

    return 0;
}