[CSAcademy]Sum of Powers

题目大意:

给定\(n,m,k(n,m,k\le4096)\)。一个无序可重集\(A\)为合法的,当且仅当\(|A|=m\)且\(\sum A_i=n\)。定义一个集合的贡献为\(\sum A_i^k\),求所有满足条件的集合的贡献之和。

思路:

\(f[i][j]\)表示将\(j\)个数之和为\(i\)的方案数,有如下两种转移:

  1. \(f[i][j]+=f[i-1][j-1]\),表示新加入一个元素\(1\);
  2. \(f[i][j]+=f[i-j][j]\),表示集合内每个元素\(+1\)。

可以证明这样就不重复、不遗漏地包含了所有的集合。

由于每个元素的贡献独立,最后枚举每种元素及其出现次数并计算贡献即可。

时间复杂度\(\mathcal O(nm)\)。

源代码:

#include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=4097,mod=1e9+7;
int f[N][N];
inline int power(int a,int k) {
int ret=1;
for(;k;k>>=1) {
if(k&1) ret=1ll*ret*a%mod;
a=1ll*a*a%mod;
}
return ret;
}
int main() {
const int n=getint(),m=getint(),k=getint();
f[0][0]=1;
for(register int i=1;i<=n;i++) {
for(register int j=1;j<=m&&j<=i;j++) {
f[i][j]=(f[i-1][j-1]+f[i-j][j])%mod;
}
}
int ans=0;
for(register int i=1;i<=n-m+1;i++) {
const int pwr=power(i,k);
for(register int j=1;j<=m&&i*j<=n;j++) {
(ans+=1ll*pwr*f[n-i*j][m-j]%mod)%=mod;
}
}
printf("%d\n",ans);
return 0;
}

最新文章

  1. table 相关
  2. O2O营销模式(Online To Offline)
  3. Xcode 缓存 帮助文档 隐藏文件夹显示方法
  4. 这世上倒底有没有神仙——说“Excel不是数据库,是不是犯了白马非马论的错误??
  5. zabbix表结构
  6. HDU 3853(期望DP)
  7. [php] How to debug PHP in the terminal
  8. Codeforces Gym 100231B Intervals 线段树+二分+贪心
  9. Java凝视Override、Deprecated、SuppressWarnings具体解释
  10. 【Jquery EasyUI + Servlet】DataGrid,url请求带中文出现乱码的解决方案
  11. 修改vim默认tab为4个空格与显示行号
  12. Spring AOP报错
  13. [转]Adventures in Xen exploitation
  14. HITCON-Training-master 部分 Writeup(12月11更新)
  15. HTTP协议快速入门指南
  16. Java8-1-新特性_Lambda表达式
  17. P1120 小木棍 [数据加强版] 回溯法 终极剪枝
  18. HDFS常用API(2)
  19. SAP成本核算说明
  20. Ubuntu14.04搭建Android O编译环境

热门文章

  1. Java 画一个5X5的方形矩阵
  2. requests禁止重定向
  3. axios简单使用
  4. YOLO V2 代码分析
  5. IIS异常
  6. 【Android】Android 代码判断是否获取ROOT权限(一)
  7. CAS和ABA问题
  8. Python_os模块
  9. Could not locate executable null\bin\winutils.exe in the Hadoop binaries解决方式 spark运行wordcoult
  10. 获取本地的ip,地址,code