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 = 1e2 + 5;
  11. const int K = 1e5 + 5;
  12. const int MOD = 1e9 + 7;
  13.  
  14. int n, k;
  15. int a[N];
  16. int dp[N][K]; // dp[i][j] = xét đến đứa trẻ thứ i và chia j cây kẹo
  17. int sum[N][K]; // sum[i][j] = tổng các dp[i][1] + dp[i][2] + ... + dp[i][j]
  18.  
  19. int add(int a, int b) {
  20. int ans = (a + b) % MOD;
  21. if (ans < 0) ans += MOD;
  22. return ans;
  23. }
  24.  
  25. int getSum(int i, int lj, int rj) {
  26. int ans = sum[i][rj];
  27. if (lj - 1 >= 0) ans = add(ans, -sum[i][lj - 1]);
  28. return ans;
  29. }
  30.  
  31. int main() {
  32. ios::sync_with_stdio(0); cin.tie(0);
  33. cin >> n >> k;
  34. for (int i = 1; i <= n; i++) cin >> a[i];
  35.  
  36. dp[0][0] = 1;
  37. for (int j = 0; j <= k; j++) sum[0][j] = 1;
  38.  
  39. for (int i = 1; i <= n; i++) {
  40. for (int j = 0; j <= k; j++) {
  41. // for (int x = 0; x <= a[i]; x++) {
  42. // if (j - x >= 0) add(dp[i][j], dp[i - 1][j - x]);
  43. // }
  44. dp[i][j] = getSum(i - 1, j - a[i], j);
  45. sum[i][j] = dp[i][j];
  46. }
  47.  
  48. for (int j = 1; j <= k; j++) sum[i][j] = add(sum[i][j], sum[i][j - 1]);
  49. }
  50.  
  51. cout << dp[n][k] << '\n';
  52. }
Success #stdin #stdout 0.01s 11304KB
stdin
4 100000
100000 100000 100000 100000
stdout
665683269