Cod sursa(job #1390654)

Utilizator karlaKarla Maria karla Data 17 martie 2015 10:56:04
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <stdio.h>

using namespace std;

FILE*f=fopen("pairs.in","r"),*g=fopen("pairs.out","w");
int fp[1000100], nr[1000100], n, maxim, val;
bool c[1000100], m[1000100], v[1000100];

int main()
{
    int x;
    fscanf(f,"%d\n", &n);
    for(int i = 1; i <= n; i++)
    {
        fscanf(f,"%d\n", &x);
        v[x] = 1;
        if(x > maxim )
            maxim = x;
    }
    bool pr;
    for(int i = 2; i <= maxim; i++)
    {
        if(c[i] == 0)
        {
            nr[++val] = i;
            pr = 1;
            for(int j = i; j <= maxim; j += i)
            {
                c[j] = 1;
                if(v[j] == 1)
                {
                    pr = 0;
                }
                fp[j] ++;
            }
            if(pr == 1)
            {
                val --;
            }
        }
    }


    for(int i = 1; i <= val; i++)
    {
        for(long long j = ((long long)nr[i]) * nr[i]; j <= maxim; j += ((long long)nr[i]) * nr[i])
        {
            m[j] = 1;
        }
    }

    long long sol = ((long long) n)*(n-1)/2;
    long long p;

    for(int i = 2; i <= maxim; i++)
    {
        if(m[i] == 0)
        {
            p = 0;
            for(int j = i; j <= maxim; j += i)
            {
                if(v[j] == 1)
                {
                    p++;
                }
            }
            if(fp[i] % 2 == 1)
            {
                sol -= p * (p-1) /2;
            }
            else
            {
                sol += p * (p-1) /2;
            }
        }
    }
    fprintf(g,"%lld", sol);

    return 0;
}