Cod sursa(job #3265944)

Utilizator andrei_botorogeanuBotorogeanu Andrei andrei_botorogeanu Data 4 ianuarie 2025 13:21:34
Problema Fractii Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
/*
TEorema fundamentala a aritmeticii:

5= 5^1
9 = 3^2
100 = 2^2*5^2: 2,5 factori primi

   N  = 12

   12 = 2^2 * 3;

   10 = 2 * 5

   n il descompui in factori primi

   PHI(n) = n (1-1/p1)(1-1/p2)....

   p este prim | n


   PHI(12) = 12 (1-1/2)*(1 - 1/3); 4: 1,5,7,11

   PHI(10) = 10 (1-1/2)*(1 - 1/5)

   daca numarul este prim: 17

   regula este n-1 coprimes
   1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16

   PHI(N)

   fractii

N = 4

   1/1 1/2 1/3 1/4 2/1 2/3 3/1 3/2 3/4 4/1 4/3
   avem 11 fractii

   phi(1) phi(2) + phi(3) + phi(4) = suma

   suma * 2

   5 + 5 + 1
*/
#include <stdio.h>
#define FIN "fractii.in"
#define FOUT "fractii.out"

void computePHI(long long int n, long long int *ptr) {

        long long phi[ n + 1 ];

        long long sum = 0;

        //phi[1] = 1
        //phi[2] = 2
        //phi[3] = 3
        //phi[4] = 4
        for(int i = 1; i <= n; ++i) phi[i] = i;

        for(int i = 2; i <= n; ++i) {

                //daca este numar prim
                if(phi[i] == i) {

                   for(int j = i; j <= n; j += i) {
                          //euler's totient = indictorul lui Euler
                          phi[ j ] = phi[ j ] / i * (i - 1 );
                   }
                }

                sum += phi[i];
        }


        *ptr = ( sum<<1 ) + 1;
}

int main(int argc, char const *argv[]) {

  long long n, ans;

  freopen(FIN, "r", stdin);
  freopen(FOUT, "w", stdout);

  scanf("%lld",&n);

  computePHI(n,&ans);

  printf("%lld",ans);

  return 0;
}