Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.43 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<cstdlib>
  7. #include<ctime>
  8. #include<algorithm>
  9. #include<vector>
  10. #include<queue>
  11. #include<list>
  12. #include<string>
  13. #include<set>
  14. #include<map>
  15. #include<iomanip>
  16. #include<sstream>
  17. #include<functional>
  18. #include<climits>
  19. #include<unordered_set>
  20. #include<unordered_map>
  21. #include<bitset>
  22.  
  23. const long double eps = 1e-5;
  24. const int MOD = 1000000007;
  25. using namespace std;
  26.  
  27. int n, a, P;
  28. bool find(long long num) {
  29. if(num < P) return false;
  30. if(num == P || num == P + 1) return true;
  31. if(num % P != 0 && (num - 1) % P != 0) return false;
  32. return num % P == 0 ? find(num / P) : find((num - 1) / P);
  33. }
  34. int solve(int num, int rem) {
  35. if(num < P) return 0;
  36. if(num == P && rem == 0) return 0;
  37. if(num == P && rem == 1) return 0;
  38. if(num == P + 1 && rem == 0) return 1;
  39. if(num == P + 1 && rem == 1) return 1;
  40. if(num == P + 2 && rem == 1) return 1;
  41. if(num == 2 * P + 1 && rem == 0) return 1;
  42. if(num == 2 * P + 1 && rem == 1) return 1;
  43. if(num == 2 * P && rem == 1) return 1;
  44. if(num == 2 * P + 2 && rem == 1) return 1;
  45. if(rem > 2) return 0;
  46. if((num - 1) % P == 0) {
  47. int pp = (num - 1) / P;
  48. int c = pp / 2;
  49. if(find(c) && ((c * P + c * P + 1 == num) || (((c + 1) * P + (c + 1) * P + 1) == num))) return 1;
  50. }
  51. if(num % P == 0) return find(num - 1) + solve(num / P, 0);
  52. if((num - 2) % P == 0) return find(num - 1) + solve((num - 2) / P, 0);
  53. if((num - 1) % P == 0) return find(num - 1) + 2 * solve((num - 1) / P, 1);
  54. return 0;
  55. }
  56.  
  57. // Bruteforce ================
  58. unordered_set<int> bfNums;
  59. void bruteforce(int x) {
  60. if(x > 1000000) return;
  61. bfNums.insert(x);
  62. bruteforce(P * x);
  63. bruteforce(P * x + 1);
  64. }
  65.  
  66. int waysBf(int x) {
  67. int w = 0;
  68. for(unordered_set<int> ::iterator it = bfNums.begin(); it != bfNums.end(); ++it) {
  69. int p = *it;
  70. if(p != x - p) {
  71. w += bfNums.count(x - p);
  72. // if(x == 165 && bfNums.count(x - p) cout << p << " " << x - p << endl;
  73. }
  74. }
  75. return w / 2;
  76. }
  77. //================================
  78.  
  79. int main() {
  80. scanf("%d %d", &n, &P);
  81. bruteforce(1);
  82. for(int a = 1; a <= n; ++a) {
  83. int w = 0;
  84. if(a % 2 == 1 && find(a / 2) && find(a / 2 + 1)) w = 1;
  85. else w = solve(a, 0);
  86. int wBf = waysBf(a);
  87. if(w != wBf) {
  88. printf("Mismatch for number %d - ways %d, waysBf %d.\n", a, w, wBf);
  89. }
  90. }
  91. return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement