#include <bits/stdc++.h>
using namespace std;
bool inUpper(int stepsLeft, long long sumLeft, int lastVal) {
  long long curr = lastVal;
  while (stepsLeft > 0) {
    curr *= 2;
    sumLeft -= curr;
    stepsLeft--;
    if (sumLeft <= 0) return true;
    if (stepsLeft == 0) return false;
  }
  return sumLeft <= 0;
}
bool inLower(int stepsLeft, long long sumLeft, long long lastVal) {
  long long x = (2 * lastVal + 1 + stepsLeft);
  x *= stepsLeft;
  x /= 2;
  return x <= sumLeft;
}
pair<int, int> findStart(int k, long long sumLeft) {
  long long biggestPot = (1L << 30);
  long long pot2 = biggestPot;
  int lastOkIL = 0;
  while (pot2) {
    bool iL = inLower(k, sumLeft - (lastOkIL + pot2), (lastOkIL + pot2));
    if (iL) lastOkIL += pot2;
    pot2 /= 2;
  }
  pot2 = biggestPot;
  int firstOkIB = 0;
  while (pot2) {
    bool iL = !inUpper(k, sumLeft - (firstOkIB + pot2), (firstOkIB + pot2));
    if (iL) firstOkIB += pot2;
    pot2 /= 2;
  }
  return make_pair(firstOkIB, lastOkIL);
}
int main() {
  long long n;
  int k;
  cin >> n >> k;
  vector<int> ans;
  long long sumLeft = n;
  for (int i = 1; i <= k; ++i) {
    int val = -1;
    auto x = findStart(k - i, sumLeft);
    int start = x.first;
    int end = x.second;
    if (ans.size() && start <= end) {
      start = max(start, ans.back() + 1);
      end = min(end, ans.back() * 2);
    }
    for (int j = start; j <= end; ++j) {
      bool iL = inLower(k - i, sumLeft - j, j);
      bool iU = inUpper(k - i, sumLeft - j, j);
      if (iL && iU) {
        val = j;
        break;
      }
    }
    if (val == -1) {
      cout << "NO" << endl;
      return 0;
    }
    ans.push_back(val);
    sumLeft -= val;
  }
  cout << "YES" << endl;
  for (auto x : ans) cout << x << " ";
  cout << endl;
}
