Cod sursa(job #1737278)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 3 august 2016 17:03:37
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<fstream>
#include<cstring>
using namespace std;
int n, i, j, nr, maxim;
int c[1005], ok[1005], num[1005], v[505], sol[300], aux[300];
int pt[505][300];
ifstream fin("indep.in");
ofstream fout("indep.out");
void mult(int a[], int x, int v[]){
    v[0] = a[0];
    int i, t = 0;
    for(i = 1; i <= v[0]; i++){
        v[i] = a[i] * x + t;
        t = v[i] / 10;
        v[i] %= 10;
    }
    while(t != 0){
        v[++v[0]] = t % 10;
        t /= 10;
    }
}
void adunare(int v[], int a[]){
    v[0] = max(v[0], a[0]);
    int i, t = 0;
    for(i = 1; i <= v[0]; i++){
        v[i] += a[i] + t;
        t = v[i] / 10;
        v[i] %= 10;
    }
    if(t != 0){
      v[++v[0] ] = t;
    }
}
void scadere(int v[], int a[]){
    int i, t = 0;
    for(i = 1; i <= v[0]; i++){
       v[i] = v[i] - a[i] - t;
       if(v[i] >= 0){
           t = 0;
       }
       else{
            t = 1;
            v[i] += 10;
       }
    }
    while(v[ v[0] ] == 0){
        v[0]--;
    }
}
int main(){
    fin>> n;
    for(i = 1; i <= n; i++){
        fin>> v[i];
        maxim = max(maxim, v[i]);
    }
    pt[0][0] = pt[0][1] = 1;
    for(i = 1; i <= n; i++){
        mult(pt[i - 1], 2, pt[i]);
    }
    aux[0] = aux[1] = 1;
    for(i = 0; i <= n; i++){
        scadere(pt[i], aux);
    }
    adunare(sol, pt[n]);
    for(i = 2; i <= maxim; i++){
        if(c[i] == 0){
            num[i] = 1;
            for(j = i + i; j <= maxim; j += i){
                c[j] = 1;
                num[j] ++;
                if(j % (i * i) == 0){
                    ok[j] = 1;
                }
            }
        }
        if(ok[i] == 0){
            nr = 0;
            for(j = 1; j <= n; j++){
                if(v[j] % i == 0){
                    nr++;
                }
            }
            if(num[i] % 2 == 1){
                scadere(sol, pt[nr]);
            }
            else{
                adunare(sol, pt[nr]);
            }
            int abc =0;
        }
    }
    for(i = sol[0]; i >= 1; i--){
        fout<< sol[i];
    }
    return 0;
}