Cod sursa(job #2551623)

Utilizator Florinos123Gaina Florin Florinos123 Data 20 februarie 2020 00:14:02
Problema Sum Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

ifstream f ("sum.in");
ofstream g ("sum.out");

int fr[200005], prime[30005];
bool ciur[200005], used[200005], aux[200005];
int t, k;
long long x;

void Eratosthene ()
{
  int i, j;
   aux[1] = 1;
    for (i=2; i<=200000; i++)
    {
       if (aux[i] == 0)
       {
         k ++;
         prime[k] = i;
           for (j=2*i; j<=200000; j+=i)
               aux[j] = 1;
       }
    }
}

void getfact (int x)
{
  int i, p;
   for (i=1; prime[i]*prime[i] <= x && i <= k; i++)
   {
       p = 0;
        while (x % prime[i] == 0)
        {
            p ++;
            x /= prime[i];
        }
       if (p > 0)
          fr[prime[i]] ++;
   }
   if (x > 1)
      fr[x] ++;
}

void solve (long long nr)
{
 int i, j;
 long long suma;
 suma =  nr * (nr+1) / 2;
 memset(used, 0, sizeof(used));
 memset(ciur, 0, sizeof(ciur));
 ciur[1] = 1;
  for (i=2; i<=nr; i++)
  {
      if (ciur[i] == 0)
      {
          for (j=i; j<=nr; j+=i)
          {
              ciur[i] = 1;
               if (fr[i] && !used[j])
               {
                   suma -= j;
                   used[j] = 1;
               }
          }
      }
  }
 g << suma << '\n';
}

int main()
{
int i;
 Eratosthene();
 f >> t;
  for (i=1; i<=t; i++)
  {
      f >> x;
      memset(fr, 0, sizeof(fr));
      getfact(x);
      solve(2*x);
  }
    return 0;
}