Informatică, întrebare adresată de katanau26, 8 ani în urmă

#3460 FirstPrime - pbinfo
Cerința
Se dau n numere naturale. Definim FP(x) cel mai mic număr prim care îl divide pe x. Aflați suma FP-urilor celor n numere.
Date de intrare
Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații.
Date de ieșire
Programul va afișa pe ecran numărul S.
Restricții și precizări
2 ≤ n ≤ 1.000.000
cele n numere citite vor fi mai mici decât 100.000.000

Răspunsuri la întrebare

Răspuns de dicamaris319
1

Răspuns:

#include <bits/stdc++.h>

namespace FastRead {

   const int Dim(5000);

   char ibuf[Dim];

   int ipos, ilen;

   char nc()

   {

       if (ipos == ilen)

       {

           ipos = 0;

           ilen = fread(ibuf, 1, Dim, stdin);

           if (!ilen) return EOF;

       }

       return ibuf[ipos++];

   }

   template<class T> void read(T& x)

   {

       char ch;

       int sgn = 1;

       while (!isdigit(ch = nc()))

           if (ch == '-')

               sgn = -1;

       x = ch - '0';

       while (isdigit(ch = nc()))

           x = x * 10 + (ch - '0');

       x *= sgn;

   }

}

using namespace FastRead;

using namespace std;

const int N(1e8);

int lp[N + 1];

vector<int> pr;

int n, x, to;

int64_t res;

int main()

{

   for (int i = 3; i <= N; i += 2) {

       if (lp[i] == 0) {

           lp[i] = i;

           pr.emplace_back(i);

       }

       to = min(N / i, lp[i]);

       for (int j = 0; j < static_cast<int>(pr.size()) && pr[j] <= to; ++j)

           lp[i * pr[j]] = pr[j];

   }

   read(n);

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

       read(x);

       if (x % 2 == 0 && x > 1)

           res += 2;

       else res += lp[x];

   }

   cout << res;

   return 0;

}

Explicație:


dicamaris319: Pai e parsarea
dicamaris319: trebuie parsare ca sa ti dea 100..e foarte horror problema
dicamaris319: Deci problema e oarecum aleasa gresit in ideea ca timpul e asa la limita si ai vzt si tu trimiti o sura iei 70 pt timp este 2 minute trm aceasi sursa iei 100...depinde de cati baga surse in acelasi timp pe site sau nush cati sunt activi etc
dicamaris319: Esentialul la problema asta este sa folosesti un ciur optimizat
dicamaris319: for (int i=3;i*i<=n;++i)
dicamaris319: for (int j=i*i;j<=n;j=j+2*i)
dicamaris319: cam asa ar arata cele doua for uri
dicamaris319: iar cazul cu 2 si numere pare le tratezi separat
katanau26: asa am facut (cu ciurul optimizat) dar primeam 70 de puncte, am sa incerc sa pun la algoritmul meu citirea optimizata din solutia doficiala . merci mult
katanau26: in loc de read-ul din solutia oficiala se poate folosi ios_base::sync_with_stdio(false);
Alte întrebări interesante