Source Code
#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
Slavery Tuff1aha
GNU G++17
119 ms
18.8 MB
Accepted