Cod sursa(job #2017581)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 1 septembrie 2017 18:31:33
Problema Indep Scor 95
Compilator c Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <stdio.h>
#include <stdlib.h>
#define C 3000
int v[501];
int log[501][C+1],rez[C+1],s[C+1];
void scad(int a[],int b[])
{
    int i,o;
    o=0;
    for(i=C; i>0; i--)
    {
        a[i]=a[i]+10-b[i]-o;
        o=1-a[i]/10;
        a[i]%=10;
    }
}
void add(int a[],int b[])
{
    int i,o=0;
    for(i=C; i>0; i--)
    {
        a[i]+=b[i]+o;
        o=a[i]/10;
        a[i]%=10;
    }
}
int main()
{
    long long nr=0;
    int i,j,o,z,n,x,cmmdc,r,exp,ct,e,div;
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);
    log[0][C]=1;
    for(i=1; i<501; i++)
    {
        for(j=1; j<=C; j++)
            log[i][j]=log[i-1][j];
        o=0;
        for(j=C; j>0; j--)
        {
            z=log[i][j]*2+o;
            o=z/10;
            z%=10;
            log[i][j]=z;
        }
    }
    scanf("%d",&n);
    for(i=1; i<=n; i++)
        scanf("%d",&v[i]);
    for(i=1; i<=C; i++)
        rez[i]=log[n][i];
    nr=-1;
    for(i=2; i<=1000; i++)
    {
        z=0;
        for(j=1; j<=n; j++)
            if(v[j]%i==0)
                z++;
        x=i;
        div=2;
        exp=0;
        ct=1;
        while(div*div<=x)
        {
            e=0;
            while(x%div==0)
                e++,x/=div;
            if(e>1) ct=0;
            if(e>0) exp++;
            div++;
        }
        if(x>1) exp++;
        if(ct && z)
        {
            if(exp%2==1) scad(rez,log[z]),nr++;
            else add(rez,log[z]),nr--;
        }
    }
    if(nr>0)
    {
        for(i=C; i>0 && nr; i--)
        {
            s[i]=nr%10;
            nr/=10;
        }
        add(rez,s);
    }
    else
    {
        nr=abs(nr);
        for(i=C; i>0 && nr; i--)
        {
            s[i]=nr%10;
            nr/=10;
        }
        scad(rez,s);
    }
    for(i=1; rez[i]==0; i++);
    if(i<=C) while(i<=C) printf("%d",rez[i++]);
    else printf("0\n");

    return 0;
}