Cod sursa(job #1779936)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 15 octombrie 2016 18:25:47
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
# include <fstream>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
int p[505][400],s[400],sol[400],f[1010],e[1010];
int v[505],val[400],aux[400],n,k,i,j,nr,nr1,nr2,maxim,d,r,ok;
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]>1&&a[a[0]]==0)
        a[0]--;
}
int main () {
    fin>>n;
    for(i=1;i<=n;i++){
        fin>>v[i];
        maxim=max(maxim,v[i]);
    }
    for(i=2;i<=maxim;i++)
        if(f[i]==0){
            e[++k]=i;
            for(j=2*i;j<=maxim;j+=i)
                f[j]=1;
        }
    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=0;i<=n;i++)
        sub(p[i],val);
    sum(sol,p[n]);
    for(i=2;i<=maxim;i++){
        d=i;
        nr1=0;
        r=0;
        ok=1;
        nr=0;
        while(d!=1){
            nr2=0;
            r++;
            while(d%e[r]==0){
                nr2++;
                d/=e[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,p[nr]);
        else
            sum(s,p[nr]);
    }
    sub(sol,s);
    for(i=sol[0];i>=1;i--)
        fout<<sol[i];
    fout<<"\n";
    return 0;
}