Cod sursa(job #3168918)

Utilizator ifrim.claudiaClaudia Ifrim ifrim.claudia Data 13 noiembrie 2023 19:03:00
Problema Fractii Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
// https://www.infoarena.ro/problema/fractii
// Fractii
// Gigel, intr-o zi cand isi facea temele la matematica, s-a apucat sa scrie pe o foaie de hartie,
// un sir de fractii ireductibile de forma P/Q cu 1 ≤ P,Q ≤ N, unde N este un numar natural ales de el.
// De exemplu, pentru N = 4 el a obtinut urmatorul sir:

// 1/1 1/2 1/3 1/4 2/1 2/3 3/1 3/2 3/4 4/1 4/3

// Gigel s-a apucat apoi sa numere cate fractii a obtinut pentru N = 4 si a vazut ca sunt 11.

// Cerinta
// Fiind dat un numar natural N, sa se determine cate fractii sunt in sirul de fractii construit dupa regulile de mai sus.

// Date de intrare
// Fisierul de intrare fractii.in contine pe prima linie numarul natural N.

// Date de iesire
// Fisierul de iesire fractii.out trebuie sa contina un numar natural pe prima linie care reprezinta cate fractii sunt in sir.

// Restrictii si precizari
// 1 ≤ N ≤ 1.000.000
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("fractii.in");
ofstream fout("fractii.out");

const int MAX_LENGTH = 1000001;

int n;
// START - solution 1
// int cmmdc(int a, int b)
// {
//   while (b != 0)
//   {
//     int temp = b;
//     b = a % b;
//     a = temp;
//   }
//   return a;
// }

// int fractii_ireductibile(int x)
// {
//   int count = 0;

//   for (int i = 1; i <= x; i++)
//   {
//     for (int j = 1; j <= x; j++)
//     {
//       if (cmmdc(i, j) == 1)
//       {
//         count++;
//       }
//     }
//   }

//   return count;
// }
// END - solution 1

// START - solution 2
int phi(int n)
{
  int count = 0;
  int phi[MAX_LENGTH];
  for (int i = 1; i <= n; i++)
    phi[i] = i;
  for (int i = 2; i <= n; i++)
  {
    if (phi[i] == i)
    {
      for (int j = i; j <= n; j += i)
      {
        phi[j] = phi[j] / i * (i - 1);
      }
    }
    count = count + phi[i];
  }

  // for (int i = 1; i <= n; i++)
  // {
  //   cout << phi[i] << " ";
  // }
  // cout << endl;
  return count;
}
// END - solution 2

int main()
{
  fin >> n;
  fin.close();

  if (n < 1 || n > 1000000)
  {
    return 0;
  }

  // START - write solution 1
  // fout << fractii_ireductibile(n) << endl;
  // END - write solution 1
  // START - write solution 2
  fout << phi(n) * 2 + 1 << endl;
  // END - write solution 2
  fout.close();

  return 0;
}