【YbtOJ#20067】糖果分配

题目

题目链接:http://noip.ybtoj.com.cn/contest/102/problem/1

思路

可以视作将 \(m\) 个位置分成 \(n\) 份,第 \(i\) 份上需要填上相同且在 \([l_i,r_i]\) 中的数的积的和。
所以可以设 \(f[i][j][k]\) 表示前 \(j\) 个位置,填了前 \(i\) 个数所有方案积的和。
那么有

\[f[i][j]=f[i-1][k]+\sum^{r_i}_{p=l_i}(i^{j-k}) \]

时间复杂度 \(O(nm^2)\)

代码

#include <bits/stdc++.h>
using namespace std;

const int N=410,MOD=1e9+7;
int n,m,ans,l[N],r[N],f[N][N],g[N][N],power[N][N];

int main()
{
	freopen("candy.in","r",stdin);
	freopen("candy.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=400;i++)
	{
		power[i][0]=1;
		for (int j=1;j<=m;j++)
			power[i][j]=1LL*power[i][j-1]*i%MOD;
	}
	for (int i=1;i<=n;i++) scanf("%d",&l[i]);
	for (int i=1;i<=n;i++) scanf("%d",&r[i]);
	for (int i=1;i<=n;i++)
		for (int j=0;j<=m;j++)
			for (int k=l[i];k<=r[i];k++)
				g[i][j]=(g[i][j]+power[k][j])%MOD;
	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][j]+1LL*f[i-1][k]*g[i][j-k])%MOD;
	printf("%d",f[n][m]);
	return 0;
}
posted @ 2020-10-19 18:32  stoorz  阅读(106)  评论(0)    收藏  举报