标签: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\) 个数所有方案积的和。
那么有
时间复杂度 \(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;
}
标签:names mamicode ++ name can mat ace image const
原文地址:https://www.cnblogs.com/stoorz/p/13841924.html