Cod sursa(job #3306569)

Utilizator InformaticianInDevenire1Munteanu Mihnea Gabriel InformaticianInDevenire1 Data 12 august 2025 10:46:05
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.16 kb
#include <bits/stdc++.h>
#define int long long

using namespace std;

ifstream fin ("indep.in");
ofstream fout ("indep.out");

bool IsPrime [1002];
vector <int> primes;
vector <int> add,sbt;
int pr[1002];
int v[505];
int nrdiv[1002];

void Ciur(){
    IsPrime[0] = 0;
    IsPrime[1] = 0;
    pr[1] = 1;
    for (int i=2;i<=1000;++i){
        IsPrime[i] = 1;
        pr[i] = 1;
    }
    for (int i=2;i<=1000;++i){
        if (IsPrime[i]==1){
            pr[i] *= i;
            for (int j=2*i;j<=1000;j+=i){
                IsPrime[j] = 0;
                pr[j] *= i;
            }
        }
    }
    for (int i=2;i<=1000;++i){
        if (IsPrime[i]==1) primes.push_back(i);
    }
}

void Inmultire(vector <int> &a,int b){
    int r = 0;
    for (int i=0;i<a.size();++i){
        a[i] = a[i]*b+r;
        r = a[i]/10;
        a[i] = a[i]%10;
    }
    while (r){
        a.push_back(r%10);
        r /= 10;
    }
    return;
}

void Adunare(vector <int> &a,vector <int> b){
    while (b.size()>a.size()){
        a.push_back(0);
    }
    while (b.size()<a.size()){
        b.push_back(0);
    }
    int r = 0;
    for (int i=0;i<a.size();++i){
        a[i] = a[i]+b[i]+r;
        r = a[i]/10;
        a[i] = a[i]%10;
    }
    if (r){
        a.push_back(r);
    }
    return;
}

void Scadere(vector <int> &a,vector <int> b){
    while(b.size()<a.size()) b.push_back(0);
    int r = 0;
    for (int i=0;i<a.size();++i){
        a[i] -= b[i];
        a[i] -= r;
        if (a[i]<0){
            a[i] += 10;
            r = 1;
        }else{
            r = 0;
        }
    }
    while (a.size()>1 and !a.back()) a.pop_back();
    return;
}

signed main()
{
    Ciur();
    int n,Max = 0;
    fin >> n;
    for (int i=1;i<=n;++i){
        fin >> v[i];
        Max = max(Max,v[i]);
        for (int j=1;j<=v[i];++j){
            if (v[i]%j==0){
                nrdiv[j]++;
            }
        }
    }
    vector <int> ans;
    ans.push_back(0);
    for (int i=1;i<=Max;++i){
        if (i!=pr[i]) continue;
        int nr = 0;
        int I = i;
        for (auto x:primes){
            if (I%x==0){
                nr++;
            }
            while(I%x==0){
                I /= x;
            }
        }
        if (I>1) nr++;
        int semn = 1;
        if (nr%2==1) semn = -1;
        if (nrdiv[i]==0) continue;
        cout << i << ' ' << semn << ' ' << nrdiv[i] << '\n';
        if (semn==1) add.push_back(nrdiv[i]);
        else if (semn==-1) sbt.push_back(nrdiv[i]);
    }
    //cout << '\n';
    for (auto x:add){
        vector <int> pw;
        pw.push_back(1);
        for (int j=1;j<=x;++j){
            Inmultire(pw,2);
        }
        vector <int> vid;
        vid.push_back(1);
        Scadere(pw,vid);
        Adunare(ans,pw);
    }
    for (auto x:sbt){
        vector <int> pw;
        pw.push_back(1);
        for (int j=1;j<=x;++j){
            Inmultire(pw,2);
        }
        vector <int> vid;
        vid.push_back(1);
        Scadere(pw,vid);
        Scadere(ans,pw);
    }
    for (int i=ans.size()-1;i>=0;--i) fout << ans[i];
    return 0;
}