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糖果分配的主要内容,如果未能解决你的问题,请参考以下文章
华为OD机试 - 分糖果(Java) | 机试题+算法思路+考点+代码解析 2023