Cod sursa(job #1784320)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 19 octombrie 2016 22:25:28
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 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[1010],diferenta[1010],maxim,p[510][510],doi[1010],n,k,pork[3],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,neg;
        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;
    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;
}