Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- unsigned long long P2[66],n,k,nr,x[200005],s,kk;
- bool found = true;
- void GeneratePow2(){
- for(int i = 0;i < 64;i++)
- P2[i] = (1 << i);
- }
- int BS(unsigned long long x){
- int st = 0,dr = 63;
- while(st < dr){
- int mid = (st + dr) / 2;
- if(P2[mid] < x)
- st = mid + 1;
- else
- dr = mid;
- }
- while(P2[st] > x)
- st--;
- return st;
- }
- bool OK(int k){
- s = 0;
- if(x[k] < x[k - 1])
- return false;
- for(int i = 1;i <= k;i++)
- s += x[i];
- return (s <= nr);
- }
- void Back(int k){
- for(int i = 0;i <= n;i++){
- x[k] = P2[i];
- if(OK(k)){
- if(s == nr && k == kk){
- found = false;
- cout << "YES" << "\n";
- for(int j = 1;j <= k;j++)
- cout << x[j] << " ";
- cout << "\n";
- return;
- }else Back(k + 1);
- }
- }
- }
- int main(){
- GeneratePow2();
- cin >> nr >> kk;
- if(kk == 1)
- {
- if(!(nr & (nr - 1)))
- cout << "YES\n" << nr;
- else
- cout << "NO";
- return 0;
- }
- n = BS(nr);
- Back(1);
- if(found == true)
- cout << "NO";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement