#include <iostream> using namespace std; long long *jak,wynik=0,buf=0; unsigned long long *wbit; int n; unsigned long long m; bool przes; long long C(unsigned long long a) { long long r=0; unsigned long long k=1; for(int i=0; i<64; i++){ if(a & k)r++; k = k<<1; } return r; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n; cin>>m; jak = new long long [n]; wbit = new unsigned long long [n]; for(int i=0; i<n; i++) { cin>>jak[i]; wbit[i] = i; } for(int i=0; i<n; i++) wynik += jak[i] * C(wbit[i]); while(wbit[0]<m) { buf = 0; for(int i=0; i<n; i++) buf+=jak[i]*C(wbit[i]); if(buf > wynik) wynik = buf; przes = true; wbit[n-1]++; while(przes) { przes = false; for(int i=1; i<n; i++) if(wbit[i]>m) { wbit[i-1]++; wbit[i]=wbit[i-1]+1; przes=true; } if(wbit[0]>m) przes = false; } } int k=0; buf = 0; for(int i=n; i>0; i--) {wbit[i-1] = m - k; k++;} for(int i=0; i<n; i++) buf += jak[i] * C(wbit[i]); if(buf > wynik) wynik = buf; cout<<wynik; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #include <iostream> using namespace std; long long *jak,wynik=0,buf=0; unsigned long long *wbit; int n; unsigned long long m; bool przes; long long C(unsigned long long a) { long long r=0; unsigned long long k=1; for(int i=0; i<64; i++){ if(a & k)r++; k = k<<1; } return r; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n; cin>>m; jak = new long long [n]; wbit = new unsigned long long [n]; for(int i=0; i<n; i++) { cin>>jak[i]; wbit[i] = i; } for(int i=0; i<n; i++) wynik += jak[i] * C(wbit[i]); while(wbit[0]<m) { buf = 0; for(int i=0; i<n; i++) buf+=jak[i]*C(wbit[i]); if(buf > wynik) wynik = buf; przes = true; wbit[n-1]++; while(przes) { przes = false; for(int i=1; i<n; i++) if(wbit[i]>m) { wbit[i-1]++; wbit[i]=wbit[i-1]+1; przes=true; } if(wbit[0]>m) przes = false; } } int k=0; buf = 0; for(int i=n; i>0; i--) {wbit[i-1] = m - k; k++;} for(int i=0; i<n; i++) buf += jak[i] * C(wbit[i]); if(buf > wynik) wynik = buf; cout<<wynik; return 0; } |