Cod sursa(job #2777984)

Utilizator andreic06Andrei Calota andreic06 Data 26 septembrie 2021 23:03:52
Problema Pascal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>

using namespace std;
using ll = long long;

const int P1 = 2;
const int P2 = 3;
const int P3 = 5;
const int NMAX = 5e6;

int p[1 + NMAX], pp[1 + NMAX];

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


void legendre ( ll prime, int v[] ) {
   for ( ll pwr = prime; pwr <= NMAX; pwr *= prime ) {
      for ( ll x = pwr; x <= NMAX; x += pwr )
         v[x] ++;
   }

   for ( int i = 1; i <= NMAX; i ++ )
      v[i] += v[i - 1];
}

int main()
{
   int n, div; fin >> n >> div;

   int result;
   if ( div == P1 ) {
     legendre ( P1, p );

     result = 0;
     for ( int i = 0; i < n; i ++ )
        if ( p[n] - p[n - i - 1] - p[i + 1] >= 1 )
          result ++;
   }
   else if ( div == P1 * P1 ) {
     legendre ( P1, p );

     result = 0;
     for ( int i = 0; i < n; i ++ )
        if ( p[n] - p[n - i - 1] - p[i + 1] >= 2 )
          result ++;
   }
   else if ( div == P2 ) {
     legendre ( P2, p );

     result = 0;
     for ( int i = 0; i < n; i ++ )
        if ( p[n] - p[n - i - 1] - p[i + 1] >= 1 )
          result ++;
   }
   else if ( div == P3 ) {
     legendre ( P3, p );

     result = 0;
     for ( int i = 0; i < n; i ++ )
        if ( p[n] - p[n - i - 1] - p[i + 1] >= 1 )
          result ++;
   }
   else {
     legendre ( P1, p ); legendre ( P2, pp );

     result = 0;
     for ( int i = 0; i < n; i ++ )
        if ( p[n] - p[n - i - 1] - p[i + 1] >= 1 && pp[n] - pp[n - i - 1] - pp[i + 1] >= 1 )
          result ++;
   }
   fout << result;

    return 0;
}