Cod sursa(job #2519215)

Utilizator david.teacaDavid Stefan Teaca david.teaca Data 7 ianuarie 2020 14:20:50
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <bits/stdc++.h>
#define DIM 510
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
int n,i,j,k,nr,fact,e,ok,v[DIM],doi[DIM],p[DIM][DIM],maxim,d,s1[DIM],s2[DIM];
struct {
    int nr,fact;
} a[2*DIM];
void adunare(int A[],int B[],int C[]) {
    int t=0;
    C[0]=max(A[0],B[0]);
    for (int i=1;i<=C[0];i++) {
        C[i]=A[i]+B[i]+t;
        t=C[i]/10;
        C[i]%=10;
    }
    if (t)
        C[++C[0]]=t;
}
void scadere(int A[],int B[]) {
    int t=0;
    for (int i=B[0]+1;i<=A[0];i++)
        B[i]=0;
    for (int i=1;i<=A[0];i++) {
        A[i]-=B[i]+t;
        if (A[i]<0)
            t=1, A[i]+=10;
        else
            t=0;
    }
    while (!A[A[0]])
        A[0]--;
}
int main() {
    fin>>n;
    for (i=1;i<=n;i++) {
        fin>>v[i];
        maxim=max(maxim,v[i]);
    }
    p[0][0]=1, p[0][1]=1;
    for (i=1;i<=n;i++) {
        adunare(p[i-1],p[i-1],p[i]);
        p[i-1][1]--; //2^(i-1)-1
    }
    p[n][1]--;
    for (i=2;i<=maxim;i++) {
        nr=i, fact=0, d=2, ok=1;
        while (nr!=1) {
            e=0;
            while (nr%d==0) {
                nr/=d;
                e++;
            }
            if (e==1)
                fact++;
            if (e>=2)
                ok=0;
            d++;
        }
        if (ok) {
            a[++k].nr=i;
            a[k].fact=fact;
        }
    }
    for (i=1;i<=k;i++) {
        nr=0;
        for (j=1;j<=n;j++)
            if (v[j]%a[i].nr==0)
                nr++;
        if (a[i].fact%2==1)
            adunare(s1,p[nr],s1);
        else
            adunare(s2,p[nr],s2);
    }
    scadere(s1,s2);
    scadere(p[n],s1);
    if (p[n][0]<=0)
        fout<<"0";
    for (i=p[n][0];i>=1;i--)
        fout<<p[n][i];
    return 0;
}