题解 P4977 【毒瘤之神异之旅】

· · 题解

真是一道毒瘤的卡空间题

n^2的dp应该很容易理解

我们很容易可以想到题目要求的数组a就是如上阶梯状的东西,在第一行添加一个数或者新添一行数量为整个阶梯的宽的一行。

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;
}

但这毒瘤题卡空间 怎么办?

没关系,我们可以用动态开空间的方法过去

$delete []p;$删除数组的空间 然后这题就这样水过去了 ### code ```cpp #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]; 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 ans=0; int main() { scanf("%d%d%d",&n,&k,&m); for(int i=1;i<=n;i++) cheng[i]=poww(i,m); //for(int i=0;i<=n;i++)f[i][i]=1; f[0]=new int[n+k+1]; for(int i=0;i<=n;i++) f[0][i]=0; f[0][0]=1; for(int j=0;j<k;j++) { f[j+1]=new int[n+k+1]; for(int i=0;i<=n;i++) f[j+1][i]=0; f[j+1][j+1]=1; for(int i=j+1;i<=n;i++) f[j+1][i]=(f[j][i-1]+f[j+1][i-j-1])%mod; for(int i=1;i<=n;i++) { int num=0; if(i*(k-j)<=n)(num+=f[j][n-i*(k-j)])%=mod; ans=(ans+1ll*num*cheng[i]%mod)%mod; } delete []f[j]; f[j]=0; } cout<<ans; return 0; } ```