Cod sursa(job #1737964)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 5 august 2016 14:15:31
Problema Indep Scor 20
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],sol[400],f[1010],e[1010];
int v[505],val[2],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{
            t=1;
            a[i]+=10;
       }
    }
    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)
                sub(sol,p[nr]);
            else
                sum(sol,p[nr]);
        }
    }
    for(i=sol[0];i>=1;i--)
        fout<<sol[i];
    fout<<"\n";
    return 0;
}