YbtOJ#20067糖果分配

Posted stoorz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}



以上是关于YbtOJ#20067糖果分配的主要内容,如果未能解决你的问题,请参考以下文章

135. 分发糖果贪心算法

135. 分发糖果贪心算法

华为OD机试 - 分糖果(Java) | 机试题+算法思路+考点+代码解析 2023

如何在糖果迷之类的游戏中为瓷砖分配颜色

[LeetCode] 1103. Distribute Candies to People 分糖果

575. 分配糖果 Distribute Candies