Advertisement
Guest User

Untitled

a guest
Jan 20th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. map<int,int> repArr;
  5. int arrN[10005];
  6. string s;
  7. int onBits(int x)
  8. {
  9. int newF = 0;
  10. for(int i = 0;i <= 31;i++)
  11. if(x & (1 << i))
  12. newF++;
  13. return newF;
  14. }
  15. int countOp(int x)
  16. {
  17. int op = 0;
  18. while(x != 1)
  19. {
  20. int newF = 0;
  21. for(int i = 0;i <= 31;i++)
  22. if(x & (1 << i))
  23. newF++;
  24. x = newF;
  25. op++;
  26. }
  27. return op;
  28. }
  29. int k;
  30. long long dp[2005][2005][2];
  31. long long solve(int idx,int ones,bool setAny)
  32. {
  33. if(idx == s.length())
  34. return arrN[ones] == k;
  35.  
  36. if(dp[idx][ones][setAny] != -1)
  37. return dp[idx][ones][setAny];
  38. long long C1 = 0;
  39. if(s[idx] == '1')
  40. C1 = ((solve(idx + 1,ones + 1,setAny) % 1000000007) + (solve(idx + 1,ones,true) % 1000000007)) % 1000000007;
  41. else if(s[idx] == '0')
  42. {
  43. if(setAny)
  44. C1 += solve(idx + 1,ones + 1,setAny) % 1000000007;
  45. C1 += solve(idx + 1,ones,setAny) % 1000000007;
  46. }
  47. return dp[idx][ones][setAny] = C1 % 1000000007;
  48. }
  49. int main()
  50. {
  51. memset(dp,-1,sizeof dp);
  52. for(int i = 1;i <= 10000;i++)
  53. arrN[i] = countOp(i)+1;
  54.  
  55. cin >> s >> k;
  56. cout << solve(0,0,false) % 1000000007;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement