Cod sursa(job #1018763)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 29 octombrie 2013 22:25:42
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <cstring>

#define maxn 100001
#define maxv 1000001

using namespace std;

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

int a[maxn],n,t,prod=1,f;
int fr[maxv],v[maxv];
int p[maxn],fac[maxn];
long long s,ans;

void erathostenes (int n)
{
    t=1;
    p[1] = 2;

    for (int i=3; i<=n; i+=2)
    {
        if (!v[i])
        {
            p[++t] = i;
            for (int j=i*i; j<=n; j+=i)
            {
                v[j] = 1;
            }
        }
    }
}

void back (int k, int cnt)
{
    for (int i=k; i<=f; ++i)
    {
        prod *= fac[i];
        back (i+1,cnt+1);
        prod /= fac[i];
    }

    if (cnt%2)
    {
        s += fr[prod];
    }
    else
    {
        s -= fr[prod];
    }

    if (prod!=1) fr[prod] ++;
}

int main()
{
    fin>>n;

    erathostenes (1000);

    for (int i=1; i<=n; ++i)
    {
        fin>>a[i];

        int x = a[i];

        memset (fac,0,sizeof(fac));
        f=0;

        for (int i=1; i<=t && p[i]*p[i] <= x; ++i)
        {
            if (x%p[i]==0)
            {
                fac[++f] = p[i];
                while (x%p[i]==0)
                {
                    x /= p[i];
                }
            }
        }

        if (x!=1) fac[++f] = x;

        s=0;
        prod=1;
        back (1,0);

        ans += i-1 - s;
    }

    fout<<ans;
}