AT2021 [ARC059C] キャンディーとN人の子供 / Children and Candies
https://www.luogu.com.cn/problem/AT2021
子供向dp
简单dp,
f
[
i
]
[
j
]
表
示
第
i
个
人
,
已
经
发
了
j
个
糖
果
f[i][j]表示第i个人,已经发了j个糖果
f[i][j]表示第i个人,已经发了j个糖果
f
[
i
]
[
j
]
=
∑
k
=
0
f
[
i
−
1
]
[
j
−
k
]
(
∑
x
=
A
i
B
i
x
k
)
f[i][j]=\sum_{k=0}f[i-1][j-k](\sum_{x=A_i}^{B_i}x^k)
f[i][j]=k=0∑f[i−1][j−k](x=Ai∑Bixk)
右边那坨预处理个前缀和即可
code:
#include<bits/stdc++.h>
#define N 505
#define mod 1000000007
#define ll long long
using namespace std;
ll pw[N][N], f[N][N];
int n, m, a[N], b[N];
int main() {
for(int k = 0; k <= 400; k ++) pw[0][k] = 1;
for(int k = 1; k <= 400; k ++)
for(int i = 0; i <= 400; i ++) pw[k][i] = pw[k - 1][i] * i % mod;
for(int k = 0; k <= 400; k ++)
for(int i = 1; i <= 400; i ++) pw[k][i] += pw[k][i - 1], pw[k][i] %= mod;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i ++) scanf("%d", &b[i]);
f[0][0] = 1;
for(int i = 1; i <= n; i ++)
for(int j = 0; j <= m; j ++)
for(int k = 0; k <= j; k ++)
f[i][j] += f[i - 1][j - k] * (pw[k][b[i]] - pw[k][a[i] - 1] + mod) % mod, f[i][j] %= mod;
printf("%lld", f[n][m]);
return 0;
}