Cod sursa(job #2465738)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 30 septembrie 2019 19:08:58
Problema Indep Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
 
using namespace std;
 
ifstream fin("indep.in");
ofstream fout("indep.out");

struct bigbrain{
    int digi[214];
    bigbrain(){
        for(int i = 0; i <= 200; i++){
            digi[i] = 0;
        }
    }
    bigbrain(int a) : digi(){
        digi[0] = a%10;
    }
    void write(ostream & out){
        bool yes = false;
        for(int i = 200; i >= 0; i--){
            if(digi[i] != 0){
                yes = true;
            }
            if(yes){
                out << digi[i];
            }
        }
        if(!yes){
            out << 0;
        }
        out << "\n";
    }
    void minusone(){
        digi[0]--;
    }
    void add(bigbrain rhs){
        int r = 0;
        for(int i = 0; i <= 200; i++){
            digi[i] += rhs.digi[i] + r;
            r = digi[i] / 10;
            digi[i] %= 10;
        }
    }
    void mul(int rhs){
        int r = 0;
        for(int i = 0; i <= 200; i++){
            digi[i] *= rhs;
            digi[i] += r;
            r = digi[i] / 10;
            digi[i] %= 10;
        }
    }
    void raise(int p){
        for(int i = 0; i < p; i++){
            this->mul(2);
        }
    }
};
 
int gcd(int a, int b){
    if(a == 0){
        return b;
    }
    return gcd(b%a, a);
}
 
int n;
int frecc[1041];
 
bigbrain kapow(int a, int p){
    bigbrain r = 1;
    for(int i = 0; i < p; i++){
        r.mul(a);
    }
    return r;
}
 
bigbrain susta(int a){
    if(frecc[a] > 0){
        int d, nd;
        d = nd = 0;
        for(int i = a+1; i <= 1000; i++){
            if(frecc[i] > 0){
                if(gcd(a,i) != 1){
                    d += frecc[i];
                }else{
                    nd += frecc[i];
                }
            }
        }
        //cout << a << " " << nd  << " " << d << "\n";
        bigbrain r(1);
        r.raise(nd);
        r.minusone();
        r.raise(d);
        return r;
    }else{
        return bigbrain(0);
    }
}
 
int main(){
    int a;
    fin >> n;
    for(int i = 0; i < n; i++){
        fin >> a;
        frecc[a]++;
    }
    
    bigbrain sol(0);
    for(int i = 2; i <= 1000; i++){
        sol.add(susta(i));
    }
    sol.write(fout);
    return 0;
}