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]ij
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=0f[i1][jk](x=AiBixk)
右边那坨预处理个前缀和即可
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;
}
posted @ 2021-10-05 11:24  lahlah  阅读(111)  评论(0编辑  收藏  举报