#include <bits/stdc++.h>
using namespace std;
vector<long long> v;
void mx(){
for(int i=0 ; i<(int)v.size()-1 ; i++){
v[i] = max(v[i] , v[i+1]);
}
}
void rev(){
vector<long long> temp1 , temp2 ;
for(int i=(int)v.size()/2-1 ; i>=0 ; i--) temp1.push_back(v[i]);
for(int i=(int)v.size()-1 ; i>=(int)v.size()/2 ; i--) temp2.push_back(v[i]);
v.clear();
for(int i=0 ; i<temp1.size() ; i++) v.push_back(temp1[i]);
for(int i=0 ; i<temp2.size() ; i++) v.push_back(temp2[i]);
}
void rem(long long n){
vector<long long> temp;
long long idx = (int)v.size() , cnt = 0 , sum = 0;
for(int i=idx-1 ; i>=0 ; i--){
sum += v[i];
if(sum <= n){
cnt++;
}
else break;
}
for(int i=0 ; i<(int)v.size()-cnt ; i++){
temp.push_back(v[i]);
}
v.clear();
for(int i=0 ; i<temp.size() ; i++) v.push_back(temp[i]);
}
long long prime[2000005];
void sieve(){
prime[1] = 1 ;
for(int i=2 ; i<=2000000 ; i++){
if(prime[i] == 0){
for(int j=i ; j<=2000000 ; j += i){
prime[j] = i;
}
}
}
}
void uniq(){
// map<long long , long long> mp;
// for(int i=0 ; i<(int)v.size() ; i++) mp[v[i]]++;
// vector<int> temp ;
// for(int i=0 ; i<(int)v.size() ; i++){
// if(mp[v[i]] == 1) temp.push_back(v[i]);
// }
// v.clear();
// for(int i=0 ; i<temp.size() ; i++) v.push_back(temp[i]);
sort(v.rbegin() , v.rend());
}
void md(){
for(int i=0 ; i<(int)v.size() ; i++) v[i] %= 16384;
}
void go(){
if((int)v.size() < 3) return ;
for(int i=1 ; i<(int)v.size()-2 ; i++){
if(v[i] == 6 && v[i+1] == 7 && v[i+2] == 9){
swap(v[i] , v[i-1]);
}
}
}
long long find(long long x){
long long cnt = 0 ;
while(x){
if(x%2)cnt++;
x /= 2 ;
}
return cnt;
}
void mult(){
for(int i=0 ; i<(int)v.size() ; i++){
v[i] *= find(v[i]);
}
}
void print(){
for(int i=0 ; i<(int)v.size() ; i++){
cout << v[i] << " " ;
}
cout << endl;
}
int main() {
int n ;
cin >> n ;
v.resize(n) ;
for(int i=0 ; i<n ; i++) cin >> v[i];
v.push_back(0);
mx();
if((int)v.size() % 2 == 0){
rev();
}
else{
while((int)v.size() % 2 == 1){
rem(n);
}
rev();
}
v.push_back(3); v.push_back(2); v.push_back(1);
for(int i=0 ; i<(int)v.size() ; i++){
if(v[i] > v.back()){
swap(v[i] , v[(int)v.size()-1]);
}
}
v[0] = 1031;
sieve();
for(int i=0 ; i<(int)v.size() ; i++) v[i] = prime[v[i]];
uniq();
md();
go();
mult();
while((int)v.size() % 2 == 1){
v.push_back(3); v.push_back(2); v.push_back(1);
for(int i=0 ; i<(int)v.size() ; i++){
if(v[i] > v.back()){
swap(v[i] , v[(int)v.size()-1]);
}
}
v[0] = 1031;
for(int i=0 ; i<(int)v.size() ; i++) v[i] = prime[v[i]];
uniq();
md();
go();
mult();
//for(int j=0 ; j<(int)v.size() ; j++) cout << v[j] << " " ; cout << endl;
}
if((int)v.size() > 0 && (v[0] == 0 || v.back() == 0) ){
cout << 55 ;
return 0;
}
long long ans = 0 ;
for(int i=0 ; i<(int)v.size() ; i++){
ans += (i + 1) * v[i];
}
cout << ans;
return 0;
}
Copy