正题
题目链接:http://noip.ybtoj.com.cn/contest/102/problem/1
题目大意
nnn个xix_ixi在[li,ri][l_i,r_i][li,ri]中随机选择,给出一个ccc,一个序列∑ki=c\sum k_i=c∑ki=c
每种方案贡献为∏i=1nxiki\prod_{i=1}^nx_i^{k_i}i=1∏nxiki
解题思路
设fi,jf_{i,j}fi,j表示到第iii个小朋友,ccc已经分配了jjj出去时的贡献和
fi,j=∑k=0j(fi,k+∑z=lirizj−k)f_{i,j}=\sum_{k=0}^j(f_{i,k}+\sum_{z=l_i}^{r_i}z^{j-k})fi,j=k=0∑j(fi,k+z=li∑rizj−k)
然后预处理后面那个东西的前缀和即可,时间复杂度O(nc2)O(nc^2)O(nc2)
解题思路
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=410,XJQ=1e9+7;
ll n,c,l[N],r[N],f[N][N],z[N][N],ans;
signed main()
{freopen("candy.in","r",stdin);freopen("candy.out","w",stdout);scanf("%lld%lld",&n,&c);for(ll i=1;i<=n;i++)scanf("%lld",&l[i]);for(ll i=1;i<=n;i++)scanf("%lld",&r[i]);for(ll i=1;i<=400;i++){z[i][0]=1;for(ll j=1;j<=400;j++)z[i][j]=z[i][j-1]*i%XJQ;}for(ll i=0;i<=400;i++)for(ll j=1;j<=400;j++)(z[j][i]+=z[j-1][i])%=XJQ;f[0][0]=1;for(ll i=1;i<=n;i++)for(ll j=0;j<=c;j++)for(ll k=j;k<=c;k++)(f[i][k]+=f[i-1][j]*(z[r[i]][k-j]-z[l[i]-1][k-j])%XJQ)%=XJQ;printf("%lld",(f[n][c]+XJQ)%XJQ);
}