Cod sursa(job #2516962)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 2 ianuarie 2020 17:31:38
Problema Indep Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 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],x[2*DIM],y[2*DIM],doi[DIM],p[DIM][DIM],maxim,d,s1[DIM],s2[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]=A[i]-(B[i]+t);
        if (A[i]<0)
            t=1, A[i]+=10;
        else
            t=0;
    }
    while (!A[A[0]])
        A[0]--;
}
void inmultire(int A[],int x,int C[]) {
    int t=0;
    for (int i=0;i<=A[0];i++) {
        C[i]=A[i]*x+t;
        t=C[i]/10;
        C[i]%=10;
    }
    C[0]=A[0];
    while (t) {
        C[++C[0]]=t%10;
        t/=10;
    }
}
int main() {
    fin>>n;
    for (i=1;i<=n;i++) {
        fin>>v[i];
        maxim=max(maxim,v[i]);
    }
    doi[0]=1, doi[1]=2;
    p[1][0]=1, p[1][1]=1;
    for (i=2;i<=n;i++) {
        adunare(p[i-1],doi,p[i]);
        inmultire(doi,2,doi);
    }
    for (i=2;i<=maxim;i++) {
        nr=i, d=2, ok=1, fact=0;
        while (nr!=1) {
            e=0;
            while (nr%d==0)
                nr/=d, e++;
            if (e>=2)
                ok=0;
            if (e==1)
                fact++;
            d++;
        }
        if (ok) {
            x[++k]=i;
            y[k]=fact;
        }
    }
    s1[0]=1, s1[1]=1;
    s2[0]=1, s2[1]=1;
    for (i=1;i<=k;i++) {
        nr=0;
        for (j=1;j<=n;j++)
            if (v[j]%x[i]==0)
                nr++;
        if (y[i]%2==1)
            adunare(s1,p[nr],s1); //cand e un nr impar de factori se aduna in s1
        else
            adunare(s2,p[nr],s2); //cand e un nr par de factori se aduna in s2(care se va scadea)
    }
    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;
}