Cod sursa(job #2983575)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 22 februarie 2023 17:00:41
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <fstream>
#include <bitset>
using namespace std;

ifstream cin( "pairs.in" );
ofstream cout( "pairs.out" );

const int MAX = 1e6 + 2;

unsigned char noDiv[ MAX ];
bitset<MAX> ciur;
bitset<MAX> mb;
int n, xMax;

int main()
{
    cin >> n;
    for( int i = 1, x; i <= n; i++ ) {
        cin >> x;
        mb[ x ] = 1,
        xMax = max( xMax, x );
    }

    long long rez = (long long)n * ( n - 1 ) / 2;
    for( int i = 2; i <= xMax; i++ ) {
        if( noDiv[ i ] == 0 )
            for( int j = i; j <= xMax; j += i )
                noDiv[ j ]++;

        if( ciur[ i ] == 0 ) {
            long long ii = (long long)i * i;
            for( long long jj = ii; jj <= xMax; jj += ii )
                ciur[ jj ] = 1;

            long long R = 0;
            for( int j = i; j <= xMax; j += i )
                if( mb[ j ] == 1 )
                    R++;

            R = R * ( R - 1 ) / 2;
            ( !( noDiv[ i ] & 1 ) ) ? rez += R : rez -= R;
        }
    }

    cout << rez << '\n';
    return 0;
}