fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> ii;
  6.  
  7. const int INF = 1e9;
  8. const ll LINF = 1e18;
  9.  
  10. const int N = 2e5 + 5;
  11. const int C = 447;
  12. const int MOD = 998244353;
  13.  
  14. void add(int& a, int b) {
  15. a += b;
  16. if (a >= MOD) a -= MOD;
  17. }
  18.  
  19. int n;
  20. int a[N];
  21. int dp[N]; // dp[i] = Số tập hợp khác nhau được tô màu đen nếu ô đầu tiên được tô là ô i
  22. int sum[C + 5][C + 5]; // sum[val][r] = tổng các dp[i] sao cho i đồng dư với r (mod val)
  23.  
  24. int main() {
  25. ios::sync_with_stdio(0); cin.tie(0);
  26. cin >> n;
  27. for (int i = 1; i <= n; i++) cin >> a[i];
  28.  
  29. for (int i = n; i >= 1; i--) { // O(n * sqrt(n))
  30. dp[i] = 1;
  31.  
  32. if (a[i] >= C) {
  33. for (int x = 1; i + a[i] * x <= n; x++) { // O(sqrt(n))
  34. add(dp[i], dp[i + a[i] * x]);
  35. }
  36. }
  37. else {
  38. // i + a[i] * x = j
  39. // <=> j đồng dư với i (mod a[i])
  40. // <=> j đồng dư với i % a[i] (mod a[i])
  41. add(dp[i], sum[a[i]][i % a[i]]);
  42. }
  43.  
  44. for (int val = 1; val < C; val++) { // O(sqrt(n))
  45. add(sum[val][i % val], dp[i]);
  46. }
  47. }
  48.  
  49. cout << dp[1] << '\n';
  50. }
Success #stdin #stdout 0.01s 5284KB
stdin
40
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
stdout
721419738