fork download
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define lli long long int
  4. #define ld long double
  5. #define ull unsigned long long
  6. #define pb push_back
  7. #define freo(task) if(fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); }
  8. #define SZ(x) ((int)(x.size()))
  9. #define FOR(i, a, b) for(int i=(a); i<=(b); i++)
  10. #define FORD(i, a, b) for(int i=(a); i>=(b); i--)
  11. #define bit(x, i) ((x >> i) & 1)
  12. #define oo 1e18
  13. #define debug cout<<"VUDEPTRAI\n";
  14. using namespace std;
  15. mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
  16. ll rand(ll l, ll r) { assert(l <= r); return uniform_int_distribution<ll>(l, r)(rd); }
  17. int n, k, dp[35][35][2];
  18. void get(int n, vector<int> &digit){
  19. while(n){
  20. digit.pb(n&1);
  21. n>>=1;
  22. }
  23. }
  24. lli digitsolve(int i, int sum, bool tight, vector<int> &digit, int k){
  25. if(i<0)
  26. return sum==k;
  27. if(!tight && dp[i][sum][tight]!=-1)
  28. return dp[i][sum][tight];
  29. lli ans=0;
  30. int maxk=(tight ? digit[i] : 1);
  31. FOR(k, 0, 1){
  32. bool newtight=tight && (k==maxk);
  33. ans+=digitsolve(i-1, sum+(k==0), newtight, digit, k);
  34. }
  35. if(!tight)
  36. dp[i][sum][tight]=ans;
  37. return ans;
  38. }
  39. int main()
  40. {
  41. ios::sync_with_stdio(false);
  42. cin.tie(nullptr);
  43. // freo("");
  44. while(cin>>n>>k){
  45. memset(dp, -1, sizeof(dp));
  46. vector<int> digitN;
  47. get(n, digitN);
  48. cout<<digitsolve(digitN.size()-1, 0, 1, digitN, k)<<'\n';
  49. }
  50. // for(int c:digitN)
  51. // cout<<c<<" ";
  52. // cerr << "\n" << 1.0 * clock() / CLOCKS_PER_SEC << "s ";
  53. return 0;
  54. }
  55. /*
  56.  
  57.  
  58.  
  59. */
  60.  
Success #stdin #stdout 0s 5304KB
stdin
Standard input is empty
stdout
Standard output is empty