Cod sursa(job #911576)

Utilizator lianaliana tucar liana Data 11 martie 2013 19:38:12
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include<stdio.h>
#define vmax 1001
#define nmax 501
#define ncmax 505
long d, j, i, n, nel, nr, t, k, ii, max;
long nd[vmax], v[vmax], a[nmax], p2m1[nmax][ncmax], rez[ncmax], unu[ncmax];
bool gr[vmax];

void suma(long c[ncmax], long a[ncmax], long b[ncmax])
{
    max=a[0];
    if(b[0]>max)
        max=b[0];
    t=0;
    for (ii=1;ii<=max;ii++)
    {
        k=a[ii]+b[ii]+t;
        c[ii]=k%10; t=k/10;
    }
    c[0]=max;
    while (t>0)
    {   c[++c[0]]=t;    t=t/10; }
}

void diferenta(long c[ncmax], long a[ncmax], long b[ncmax])
{
    t=0;
    for (ii=1;ii<=a[0];ii++)
    {
        k=a[ii]-b[ii]+t;    t=0;
        if (k<0)
        {   k+=10;  t=-1;}
        c[ii]=k;
    }
    while ((c[c[0]]==0)&&(c[0]>1))
        c[0]--;
}

void ciur()
{
    d=2;
    while (d<=1000)
    {
        if (nd[d]==0)
        {
            nd[d]++;
            for(j=2;d*j<=1000;j++)
            {
                nd[d*j]++;
                if (j%d==0)
                    gr[d*j]=1;
            }
        }
        d++;
    }
    for (i=2;i<=1000;i++)
        if (!gr[i])
            v[++nel]=i;
}

void rezolvare()
{
    for (i=0;i<=p2m1[n][0];i++)
        rez[i]=p2m1[n][i];
    for (i=1;i<=nel;i++)
    {
        nr=0;
        for (j=1;j<=n;j++)
            if (a[j]%v[i]==0)
                nr++;
        if (nd[v[i]]%2==1)
            diferenta(rez,rez,p2m1[nr]);
        else
            suma(rez,rez,p2m1[nr]);
    }
}

int main()
{
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);
    ciur();
    p2m1[0][0]=1; p2m1[0][1]=0;  unu[0]=unu[1]=1;
    scanf("%ld",&n);
    for (i=1;i<=n;i++)
    {
        scanf("%ld",&a[i]);
        suma(p2m1[i],p2m1[i-1],p2m1[i-1]);    suma(p2m1[i],p2m1[i],unu);
    }
    rezolvare();
    for (i=rez[0];i>=1;i--)
        printf("%ld",rez[i]);
   /* printf("%ld\n",nel);
    for (i=1;i<=nel;i++)
        printf("%ld %ld\n",v[i],nd[v[i]]);*/
    return 0;
}