Cod sursa(job #1779025)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 14 octombrie 2016 18:01:00
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.01 kb
#include <cstdio>
#include <iostream>
#define VAL_MAX 1000

using namespace std;
int v[501],p2[501][1000],ss[501][1000],ciur[VAL_MAX+1],pl[1000],mn[1000],f[1001],prm[1000],gen[10],prim[10];
void adunss (int i){
    int j,t=0;
    for (j=1;j<=max(p2[i-1][0],ss[i-1][0]);j++){
        ss[i][j]=p2[i-1][j]+ss[i-1][j]+t;
        t=ss[i][j]/10;
        ss[i][j]%=10;
    }
    ss[i][0]=max(p2[i-1][0],ss[i-1][0]);
    if (t)
        ss[i][++ss[i][0]]=1;
}
void inmult2 (int i){
    int j,t=0;
    for (j=1;j<=p2[i-1][0];j++){
        p2[i][j]=p2[i-1][j]*2+t;
        t=p2[i][j]/10;
        p2[i][j]%=10;
    }
    p2[i][0]=p2[i-1][0];
    while (t){
        p2[i][++p2[i][0]]=t%10;
        t/=10;
    }
}
void adun (int n,int m){
    int i,t=0;
    // la ss[n] il adun pe p
    for (i=1;i<=ss[n][0];i++){
        ss[n][i]=ss[n][i]+ss[m][i]+t;
        t=ss[n][i]/10;
        ss[n][i]%=10;
    }
    if (t!=0)
        ss[n][++ss[n][0]]=1;
}
void scad (int n,int m){
    // la ss[n] il scad pe p
    int i,t=0;
    for (i=1;i<=ss[n][0];i++){
        ss[n][i]=ss[n][i]-ss[m][i]-t;
        if (ss[n][i]<0)
            t=1;
        else t=0;
        if (t)
            ss[n][i]+=10;
    }
    while (!ss[n][ss[n][0]])
        ss[n][0]--;
}
int main()
{
    FILE *fin=fopen ("indep.in","r");
    FILE *fout=fopen ("indep.out","w");
    int n,i,prod,nrf,j,d,elem;
    fscanf (fin,"%d",&n);
    for (i=1;i<=n;i++)
        fscanf (fin,"%d",&v[i]);
    p2[1][0]=ss[1][1]=ss[1][0]=1;
    p2[1][1]=2;
    for (i=2;i<=n;i++){
        adunss (i);
        inmult2 (i);
    }
    // ss reprezinta nr de subsiruri care se pot forma cu n numere
    // p2[n] este 2^n
    for (i=2;i<=VAL_MAX;i++){
        if (ciur[i]==0)
            for (j=2*i;j<=VAL_MAX;j++)
                ciur[j]++;
    }
    // ciur[j] reprezinta nr de divizori primi ai lui j
    // cand j e prim, ciur[j]=0
    for (i=1;i<=n;i++){
        d=2;
        f[v[i]]++;
        while (d*d<=v[i]){
            if (v[i]%d==0){
                f[v[i]/d]++;
                if (d*d<v[i])
                    f[d]++;
            }
            d++;
        }
    }
    // f[i] e diferit de 0 doar daca i e numar prim si EXISTA v[j] a.i. v[j]%i==0
    elem=0;
    for (i=1;i<=1000;i++){
        if (f[i]!=0 && ciur[i]==0)
           prim[++elem]=i;
    }
    // avem in v TOTI factorii primi ai numerelor
    i=elem;
    while (!gen[0]){
        j=i;
        while (gen[j]){
            gen[j]=0;
            j--;
        }
        if (!j)
            break;
        gen[j]=1;
        nrf=0;
        prod=1;
        for (j=1;j<=i;j++){
            if (gen[j]){
                prod*=prim[j];
                nrf++;
            }
        }
        if (ciur[prod]%2==0 && ciur[prod]!=0){
            // produsul se va scadea
            adun (n,f[prod]);
        }
        else scad (n,f[prod]);
    }
    if (ss[n][1]==0)
        ss[n][0]=1;
    for (i=ss[n][0];i>0;i--)
        fprintf (fout,"%d",ss[n][i]);
    return 0;
}