ProgMe

Codeforces_forever Round #1 (Div3) С

Apr 25th, 2020
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. //решение
  2. Для этой задачи существует два подхода к её решению.
  3.  
  4. Математическое решение
  5.  
  6. Заметим, что в ответе всегда будут присутствовать числа 0≤x<⌊n−−√⌋. В этом можно убедиться, решив уравнение ⌊nk⌋=x, эквивалентное неравенству x≤nk<x+1, для целых значений k. Решением двойного неравенства является промежуток k∈(nx+1;nx], длина которого равна nx2+x. При x<⌊n−−√⌋ nx2+x>1, а на промежутке длины большей, чем 1, всегда найдётся целое решение k=⌊nx⌋ ⟹ все целые числа 0≤x<⌊n−−√⌋ принадлежат ответу.
  7.  
  8. Теперь заметим, что нам больше не требуется перебирать значения k>⌊n−−√⌋, ведь этим числам всегда соответствуют значения 0≤x<⌊n−−√⌋. Таким образом, можно, как в наивном решении, перебрать все значения k до ⌊n−−√⌋ и добавить x=⌊nk⌋ к ответу. Остаётся только аккуратно обработать случай k=⌊n−−√⌋.
  9.  
  10. Асимптотика решения: O(n−−√logn) или O(n−−√)
  11. Алгоритмическое решение
  12.  
  13. В задаче можно было предположить, что чисел в ответе не так уж и много (ведь их же всех ещё нужно вывести, на что тратится основное время выполнения программы). Очевидно, что n всегда принадлежит ответу. Заметим также, что при увеличении k значение x=⌊nk⌋ уменьшается. Таким образом, можно с помощью бинарного поиска находить такое наименьшее значение k′, что nk′<x. x′=nk′ и будет являться предыдущим для x в ответе на эту задачу.
  14.  
  15. Асимптотика решения: O(n−−√logn)
  16. //реализация
  17. #include <bits/stdc++.h>
  18. #define ALL(s) (s).begin(), (s).end()
  19. #define rALL(s) (s).rbegin(), (s).rend()
  20. #define sz(s) (int)(s).size()
  21. #define mkp make_pair
  22. #define pb push_back
  23. #define sqr(s) ((s) * (s))
  24.  
  25. using namespace std;
  26.  
  27. typedef long long ll;
  28. typedef long double ld;
  29. typedef unsigned long long ull;
  30. typedef unsigned int ui;
  31.  
  32. #ifdef EUGENE
  33. mt19937 rng(1337);
  34. #else
  35. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  36. #endif
  37.  
  38. void solve() {
  39. int n;
  40. cin >> n;
  41. vector<int> ans;
  42. int s = (int)sqrtl(n);
  43. for (int i = 0; i <= s; i++)
  44. ans.pb(i);
  45. for (int i = 1; i <= s; i++)
  46. ans.pb(n / i);
  47. sort(ALL(ans));
  48. ans.resize(unique(ALL(ans)) - ans.begin());
  49. cout << sz(ans) << endl;
  50. for (int &x : ans)
  51. cout << x << " ";
  52. cout << endl;
  53. }
  54.  
  55. int main() {
  56. ios::sync_with_stdio(false); cin.tie(0);
  57. #ifdef EUGENE
  58. freopen("input.txt", "r", stdin);
  59. // freopen("output.txt", "r", stdout);
  60. #endif
  61.  
  62. int t;
  63. cin >> t;
  64. while (t--)
  65. solve();
  66. }
Add Comment
Please, Sign In to add comment