Cod sursa(job #1784620)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 20 octombrie 2016 11:57:35
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.13 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("indep.in");
ofstream g("indep.out");
int i,x[1010],xx[1010],j,nr,v[510],suma[510],diferenta[510],maxim,p[510][510],doi[510],n,k,pork[2],ok,nrdiv;
void sum(int A[],int B[],int C[])
{
    int i,t=0;

    for(i=1;i<=A[0]||i<=B[0]||t;i++)
    {
        t+=A[i]+B[i];
        C[i]=t%10;
        t=t/10;
    }
    C[0]=i-1;
}
void inm(int A[], int x, int C[])
{
    int i,t=0;
    for(i=1;i<=A[0]||t;i++)
    {
        t+=A[i]*x;
        C[i]=t%10;
        t=t/10;
    }
    C[0]=i-1;
}

void dif(int A[], int B[], int C[]){
    int i, T=0;
    for (i=B[0]+1;i<=A[0];)
        B[i++]=0;
    for (i=1;i<=A[0];i++) {
        C[i]=A[i]-(B[i]+T);
        if (C[i]<0)
            T=1;
        else
            T=0;
        if (T)
            C[i]+=10;
    }
    C[0] = A[0];
    while (!C[C[0]])
    C[0]--;
}

/*
void dif(int A[],int B[],int C[])
{
    int i,t=0;
     for (i=B[0]+1;i<=A[0];)
        B[i++]=0;
        for(i=1; i<=A[0]; i++)
        {
            if(A[i]<B[i]+t)
            {
                C[i]=A[i]+10-B[i]-t;
                t=1;
            }
            else
            {
                C[i]=A[i]-B[i]-t;
                t=0;
            }
        }
        C[0]=i-1;
        while(C[C[0]]==0)
            C[0]--;

}
*/
//int n,m,v[10000],u[10000],pork[2],i;
int main()
{
    f>>n;
    pork[0]=1;
    pork[1]=1;
    for(i=1;i<=n;i++)
        {f>>v[i];if(v[i]>maxim) maxim=v[i];}
    p[1][0]=1;
    p[1][1]=1;
    doi[0]=1;
    doi[1]=2;
    suma[0]=1;
    suma[1]=0;
    diferenta[0]=1;
    diferenta[1]=0;
    for(i=2;i<=n;i++)
    {
        inm(doi,2,doi);
        dif(doi,pork,p[i]);
    }
    int var;
    for(i=2;i<=maxim;i++)
    {
        ok=1;
        var=i;
        j=2;
        while(var!=1&&ok==1)
        {
            nr=0;
            while(var%j==0)
            {
                nr++;
                var/=j;
                if(nr>1) {ok=0;break;}
            }
            if(nr==1)
            {
                nrdiv++;
            }
            j++;
        }
        if(ok==1)
        {
            x[++k]=i;
            xx[k]=nrdiv;
        }
        nrdiv=0;
    }
    for(i=1;i<=k;i++)
    {
        nr=0;
        for(j=1;j<=n;j++)
        {
            if(v[j]%x[i]==0)
            {
                nr++;
            }
        }
        if(xx[i]%2==1)
            sum(diferenta,p[nr],diferenta);
        else
            sum(suma,p[nr],suma);
    }
    sum(p[n],suma,p[n]);
    dif(p[n],diferenta,p[n]);
    if(p[n][0]<=0)
        g<<0;
    else
    {
        for(i=p[n][0];i>=1;i--)
            g<<p[n][i];
    }
    return 0;
}



/*#include <fstream>
using namespace std;
ifstream f("intersectiesegmente.in");
ofstream g("intersectiesegmente.out");
int
int main()
{
    f>>X1>>Y1>>X2>>Y2>>X3>>Y3>>X4>>Y4;
    A1=Y2-Y1;
    B1=X1-X2;
    C1=Y1*(X2-X1)-X1*(Y2-Y1);
    A2=Y4-Y3;
    B2=X3-X4;
    C2=Y3*(X4-X3)-X3*(Y4-Y3);
    Y=A1*C2-A2*C1;
    Y=Y/(A2*B1-B2*A1);
    X=Y*(-B2)-C2;
    X=X/A2;

    return 0;
}
*/