码迷,mamicode.com
首页 > 其他好文 > 详细

【YbtOJ#20067】糖果分配

时间:2020-10-19 23:02:49      阅读:21      评论:0      收藏:0      [点我收藏+]

标签:names   mamicode   ++   name   can   mat   ace   image   const   

题目

题目链接: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;
}

【YbtOJ#20067】糖果分配

标签:names   mamicode   ++   name   can   mat   ace   image   const   

原文地址:https://www.cnblogs.com/stoorz/p/13841924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!