Cod sursa(job #109324)

Utilizator mariusdrgdragus marius mariusdrg Data 25 noiembrie 2007 10:14:23
Problema Pairs Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasa a 10-a Marime 2.36 kb
#include<stdio.h>


const int maxn = 100001;

int i;
int n;
int j;
int ciur[10000];
int s[1000];
int a[maxn];
int nr[10000];
int si[maxn * 10];
int prod;
int nr1;
int b[maxn];
long long sol;

void bkts(int i)
{
        if (i > s[0])
        {
                if ((nr1 & 1) == 1) sol -= si[prod];
                         else sol += si[prod];
                return;
        }
        for(b[i] = 0;b[i] <= 1; ++b[i])
        {
                if (b[i] == 1)
                {
                        ++nr1;
                        prod *= s[i];
                }
                bkts(i + 1);
                if (b[i] == 1)
                {
                        --nr1;
                        prod /= s[i];
                }
        }
}

void bkta(int i)
{
        if (i > s[0])
        {
                ++si[prod];
                return;
        }
        for(b[i] = 0;b[i] <= 1; ++b[i])
        {
                if (b[i] == 1)
                {
                        prod *= s[i];
                }
                bkta(i + 1);
                if (b[i] == 1)
                {
                        prod /= s[i];
                }
        }
}


int main()
{
        freopen("pairs.in","r",stdin);
        freopen("pairs.out","w",stdout);
        scanf("%d",&n);
        for(i = 1;i <= n; ++i)
        {
                scanf("%d",&a[i]);
        }
        for(i = 2;i <= 1001;++i)
        {
                if (ciur[i] != 0) continue;
                nr[++nr[0]] = i;
                for(j = i;j <= 1001; j += i)
                {
                        ciur[j] = 1;
                }
        }
        for(i = 1;i <= n; ++i)
        {
                prod = 1;
                s[0] = 0;
                nr1 = 0;
                for(j = 1;j <= nr[0]; ++j)
                {
                        if (a[i] % nr[j] == 0)
                        {
                                s[++s[0]] = nr[j];
                                while(a[i] % nr[j] == 0)
                                {
                                        a[i] /= nr[j];
                                }
                                if (a[i] == 1) break;
                        }
                }
                if (a[i] != 1)
                {
                        s[++s[0]] = a[i];
                }
                bkts(1);
                prod = 1;
                bkta(1);
        }
        printf("%lld\n",sol);

}