Cod sursa(job #1737526)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 4 august 2016 13:03:06
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
# include <fstream>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
int p[505][400],s[400],sol[400],c[2][1010],f[1010],e[1010];
int v[505],val[2],aux[400],n,k,u,p1,i,j,ec,vc,nr;
void mul(int a[],int k,int b[]){
    int t=0,i;
    for(i=1;i<=a[0]||t;i++,t/=10)
        b[i]=(t+=a[i]*k)%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]>0&&a[a[0]]==0)
        a[0]--;
}
void copy(int a[],int b[]){
    int i;
    for(i=0;i<=b[0];i++)
        a[i]=b[i];
}
int main () {
    p1=1;
    for(i=2;i<=1000;i++){
        if(f[i]==0){
            c[0][++u]=i;
            c[1][u]=1;
            e[++k]=i;
            for(j=2*i;j<=1000;j+=i)
                f[j]=1;
        }
    }
    while(p1<=u){
        ec=c[0][p1];
        vc=c[1][p1++];
        for(i=1;i<=k;i++){
            if(ec%e[i]!=0&&ec*e[i]<=1000&&f[ec*e[i]]==1){
                c[0][++u]=ec*e[i];
                c[1][u]=-vc;
                f[c[0][u]]=0;
            }
        }
    }
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i];
    p[0][0]=p[0][1]=1;
    for(i=1;i<=n;i++)
        mul(p[i-1],2,p[i]);
    val[0]=val[1]=1;
    for(i=1;i<=u;i++){
        nr=0;
        for(j=1;j<=n;j++)
            if(v[j]%c[0][i]==0)
                nr++;
        copy(aux,p[nr]);
        sub(aux,val);
        if(c[1][i]==1)
            sum(s,aux);
        else
            sub(s,aux);
    }
    copy(sol,p[n]);
    sub(sol,val);
    sub(sol,s);
    for(i=sol[0];i>=1;i--)
        fout<<sol[i];
    fout<<"\n";
    return 0;
}