DZYO的博客

QQ:815095999 欢迎交流问题

CS Academy #32 G:Sum of Powers (旋转体积背包)

传送门

题解:
整数划分的方法做旋转体积背包处理出fi,j表示将整数i划分为j个数的方案数。

然后对于每个数枚举至少被算几次即可。 时间复杂度O(nk)

#include <bits/stdc++.h>
using namespace std;

const int N=5e3+50, mod=1e9+7;
inline int add(int x, int y) {return (x+y>=mod) ? (x+y-mod) : (x+y);}
inline int dec(int x, int y) {return (x-y<0) ? (x-y+mod) : (x-y);}
inline int mul(int x, int y) {return ((unsigned long long)x*y%mod);}
inline int power(int a,int b,int rs=1) {for(;b;b>>=1,a=mul(a,a)) if(b&1) rs=mul(rs,a); return rs;}
int n,m,k,ans,f[N][N];

int main() {
    cin>>n>>k>>m; f[0][0]=1;
    for(int i=1;i<=n;i++) 
        for(int j=1;j<=i && j<=k;j++) 
            f[i][j]=add(f[i-j][j],f[i-1][j-1]);
    for(int i=1,pw=1;i<=n;i++,pw=power(i,m)) 
        for(int j=1;j*i<=n && j<=k;++j) 
            ans=add(ans,mul(f[n-i*j][k-j],pw));
    cout<<ans<<endl;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35649707/article/details/80348613
个人分类: DP及DP优化
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

CS Academy #32 G:Sum of Powers (旋转体积背包)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭