题解 P4977 【毒瘤之神异之旅】
真是一道毒瘤的卡空间题
n^2的dp应该很容易理解
- 111111111
- 1111111
- 1111111
- 1111
- 1
我们很容易可以想到题目要求的数组a就是如上阶梯状的东西,在第一行添加一个数或者新添一行数量为整个阶梯的宽的一行。
-
所以设
f[i][j] 表示当前还剩i个‘1’宽为j的方案数 -
code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
using namespace std;
const int mod=1e9+7;
int m,k,cheng[10005],n,f[10005][10005];
int poww(int x,int nn)
{
int res=1;
while(nn)
{
if(nn&1)res=1ll*res*x%mod;
x=1ll*x*x%mod;
nn>>=1;
}
return res;
}
int main()
{
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=10000;i++)
cheng[i]=poww(i,m);
for(int i=0;i<=n;i++)
f[i][i]=1;
for(int x=1;x<=k;x++)
for(int i=x;i<=n;i++)
f[i][x]=(f[i-1][x-1]+f[i-x][x])%mod;
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
{
int num=0;
if(i*j<=n)num+=f[n-i*j][k-j];
ans=(ans+1ll*num*cheng[i]%mod)%mod;
}
cout<<ans;
return 0;
}
但这毒瘤题卡空间 怎么办?
没关系,我们可以用动态开空间的方法过去