Dsxv

lucky_number_dp_count

Jul 28th, 2020
763
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.77 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std ;
  3.  
  4. #define int long long
  5.  
  6. int dp[61][2][2][2] ;
  7.  
  8. int solve(int &x , int i = 60 , int j = 0 , int k = 0 , bool ok = 0){
  9.     if(i == -1){
  10.         return 1 ;
  11.     }
  12.     if(~dp[i][j][k][ok]) return dp[i][j][k][ok] ;
  13.     int ans = 0 ;
  14.     if((1LL<<i)&x){
  15.         if(j == 0 && k == 1){
  16.             ans = solve(x , i - 1 , 0 , j , ok|true) ;
  17.         } else {
  18.             ans = solve(x , i - 1 , 1 , j , ok) + solve(x , i - 1 , 0 , j , ok|true) ;
  19.         }
  20.     } else {
  21.         if(ok && !(j == 0 && k == 1)) ans = solve(x , i - 1 , 1 , j , ok) ;
  22.         ans += solve(x , i - 1 , 0 , j , ok) ;
  23.     }
  24.     return dp[i][j][k][ok] = ans ;
  25. }
  26.  
  27. int32_t main(){
  28.     memset(dp , -1 , sizeof(dp)) ;
  29.     int x ;
  30.     cin >> x ;
  31.     int unum = solve(x) - 1 ; // -1 because 0 is also included
  32.     cout << x - unum;
  33.     return 0 ;
  34. }
  35.  
  36.  
Advertisement
Add Comment
Please, Sign In to add comment