Cod sursa(job #2161867)

Utilizator Daria09Florea Daria Daria09 Data 11 martie 2018 21:31:49
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#define nmax 502
#define vmax 402

using namespace std;

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

int v[nmax],val[vmax],aux[vmax],n,z,i,j,nr,nr1,nr2,maxim,l,r,ok,d[nmax][vmax],s[vmax],rez[vmax],h[nmax*2],h2[nmax*2];
void mul(int a[],int z,int b[])
{
    int t=0,i;
    for(i=1; i<=a[0]||t; i++,t/=10)
        b[i]=(t+=a[i]*z)%10;
    b[0]=i-1;
}
void sum(int a[],int b[])
{
    int t=0,i;
    for(i=1; i<=a[0]||i<=b[0]||t; i++,t/=10)
        a[i]=(t+=a[i]+b[i])%10;
    a[0]=i-1;
}
void sub(int a[],int b[])
{
    int t=0,i;
    for(i=1; i<=a[0]; i++)
    {
        a[i]=a[i]-b[i]-t;
        if(a[i]>=0)
            t=0;
        else
        {
            a[i]+=10;
            t=1;
        }
    }
    while(a[0]>1&&a[a[0]]==0)
        a[0]--;
}
int main ()
{
    int i,j;
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>v[i];
        maxim=max(maxim,v[i]);
    }
    fin.close();
    for(i=2; i<=maxim; i++)
        if(h[i]==0)
        {
            h2[++z]=i;
            for(j=2*i; j<=maxim; j+=i)
                h[j]=1;
        }
    d[0][0]=d[0][1]=1;
    for(i=1; i<=n; i++)
        mul(d[i-1],2,d[i]);
    val[0]=val[1]=1;
    for(i=0; i<=n; i++)
        sub(d[i],val);
    sum(rez,d[n]);
    for(i=2; i<=maxim; i++)
    {
        l=i;
        nr1=0;
        r=0;
        ok=1;
        nr=0;
        while(l!=1)
        {
            nr2=0;
            r++;
            while(l%h2[r]==0)
            {
                nr2++;
                l/=h2[r];
            }
            if(nr2>1)
                ok=0;
            if(nr2!=0)
                nr1++;
        }
        if(ok)
        {
            for(j=1; j<=n; j++)
            {
                if(v[j]%i==0)
                    nr++;
            }
        }
        if(nr1%2==0)
            sub(s,d[nr]);
        else
            sum(s,d[nr]);
    }
    sub(rez,s);
    for(i=rez[0]; i>=1; i--)
        fout<<rez[i];
    fout.close();
    return 0;
}