ProgMe

Codeforces_forever Round #1 (Div3) Е

Apr 25th, 2020
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. //решение
  2. Предположим, что мы хотим посчитать количество блоков длины $$$len$$$. Разделим эти блоки на два типа:
  3.  
  4. блоки, которые находятся в начале и конце числа (например блоки $$$111$$$ и $$$0$$$ в числе $$$11173220$$$);
  5. остальные блоки.
  6. Для начала посчитаем количество блоков первого типа. Мы можем выбрать $$$2$$$ варианта расположения таких блоков (в начале и в конце числа). Теперь мы можем выбрать $$$10$$$ вариантов цифр для этого блока. Далее мы можем выбрать $$$9$$$ вариантов цифр для соседнего блока (если эти блоки будут состоять из одинаковых цифр, то длина блока, количество которого мы считаем будет больше $$$len$$$, а значит мы можем выбрать цифру соседнего блока только $$$9$$$ вариантами). Наконец, мы можем выбрать оставшиеся цифры $$$10^{n-len-1}$$$ способами.
  7.  
  8. Таким образом, суммарное количество блоков первого типа $$$2 \cdot 10 \cdot 9 \cdot 10^{n-len-1}$$$.
  9.  
  10. Теперь посчитаем количество блоков второго типа. Мы можем выбрать $$$n - len - 1$$$ вариантов расположения таких блоков (все варианты кроме начала и конца числа). Теперь мы можем выбрать $$$10$$$ вариантов цифр для этого блока. Далее мы можем выбрать $$$9^2$$$ вариантов цифр для соседнегих блоков ($$$9$$$ вариантов для блока слева и $$$9$$$ вариантов для блока справа). Наконец, мы можем выбрать оставшиеся цифры $$$10^{n-len-2}$$$ способами.
  11.  
  12. Таким образом, суммарное количество блоков второго типа $$$(n - len - 1) \cdot 10 \cdot 9^2 \cdot 10^{n-len-2}$$$.
  13.  
  14. На этом почти все. У нас есть один частный случай. Если $$$len = n$$$, то количество блоков будет равно $$$10$$$.
  15. //реализация
  16. #include<bits/stdc++.h>
  17.  
  18. using namespace std;
  19.  
  20. const int MOD = 998244353;
  21.  
  22. int add(int a, int b, int m = MOD) {
  23. return ((a % m) + (b % m)) % m;
  24. }
  25.  
  26. int mul(int a, int b, int m = MOD) {
  27. return ((long long) (a % m) * (b % m)) % m;
  28. }
  29.  
  30. int power(int b, int e, int m = MOD) {
  31. if (e == 0) return 1;
  32. int res = power(mul(b, b), e / 2);
  33. if (e % 2) res = mul(res, b);
  34. return res;
  35. }
  36.  
  37. int solve(int x, int n) {
  38. int res = 0;
  39. if (x == n) res = add(res, 10);
  40. if (x + 1 <= n) res = mul(9, mul(2, power(10, n - x)));
  41. if (x + 2 <= n) res = add(res, mul(81, mul(n - x - 1, power(10, n - x - 1))));
  42. return res;
  43. }
  44.  
  45. int main() {
  46. int n;
  47. cin >> n;
  48. for (int x = 1; x <= n; x++) {
  49. cout << solve(x, n) << " ";
  50. }
  51. cout << '\n';
  52. }
Add Comment
Please, Sign In to add comment