ProgMe

Codeforces_forever Round #3 (Div4) B

Apr 30th, 2020
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.09 KB | None | 0 0
  1. Заметим, что
  2. k−1
  3. ∑
  4. i=0 2i=2k−1. Поэтому мы можем заменить изначальное уравнение следующим: (2k−1)x=n. Итак, мы можем перебрать все возможные k в отрезке [2;29] (потому что 230−1>109) и проверить, делится ли n на 2k−1. Если делится, то мы можем вывести x=
  5. n
  6. 2k−1
  7.  
  8. .
  9.  
  10. P.S. Я знаю, что много участников нашли формулу
  11. k−1
  12. ∑
  13. i=0 2i=2k−1, используя формулу суммы геометрической прогрессии, но есть другой путь понять это, и он намного более интуитивен, по крайней мере для меня. Просто посмотрим на двоичные представления чисел: можно заметить, что 20=1,21=10,22=100, и так далее. Поэтому 20=1,20+21=11,20+21+22=111, и так далее. И если мы добавим единицу к этому числу, состоящему из k единиц, то мы получим 2k.
  14. #include <bits/stdc++.h>
  15. #define int int64_t
  16. #define double long double
  17. #define F first
  18. #define S second
  19. #define pb push_back
  20. #define pf push_front
  21. #define ppb pop_back();
  22. #define ppf pop_front();
  23. #define For(n) for (int i = 0; i < n; i++)
  24. #define FOR(i, n) for (i; i < n; i++)
  25. #define optimization ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  26.  
  27. using namespace std;
  28. typedef pair <int, int> pii;
  29. typedef deque <int> di;
  30.  
  31. int binpow(int x, int y)
  32. {
  33. if (y == 0)
  34. return 1;
  35. if (y & 1)
  36. return binpow(x, y - 1) * x;
  37. else
  38. {
  39. int ans = binpow(x, y / 2);
  40. return ans * ans;
  41. }
  42. }
  43.  
  44. int32_t main()
  45. {
  46. int t;
  47. cin >> t;
  48. while (t--)
  49. {
  50. int n;
  51. cin >> n;
  52. int sum = 3, prsum = 4;
  53. while (n % sum)
  54. {
  55. sum += prsum;
  56. prsum *= 2;
  57. }
  58. cout << n / sum << "\n";
  59. }
  60. }
Advertisement
Add Comment
Please, Sign In to add comment