bzoj 3612: [Heoi2014]平衡【整数划分dp】
2024-08-30 19:52:06
其实就是-n~n中求选k个不同的数,和为0的方案数
学到了新姿势叫整数划分,具体实现是dp 详见:https://blog.csdn.net/Vmurder/article/details/42551603
设f[i][j]为j个数和为i的方案数,然后因为互不相同,所以转移的话有两种,就是当前j个数全部+1,和当前j个数全部+1并且多填一个1出来,也就是f[i][j]=f[i-j][j]+f[i-j][j-1]
但是这里要求选的数不能超过n,我们考虑i>n的f中一定有一个大于n的数,我们把这种情况减掉就行了,也就是f[i][j]-=f[i-n-1][j-1]
这是上面那个blog的截图
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int T,n,m,mod,f[N][15],ans;
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int main()
{
T=read();
while(T--)
{
n=read(),m=read(),mod=read();
f[0][0]=1,ans=0;
for(int i=1;i<=n*m;i++)
for(int j=1;j<=m;j++)
{
if(i>=j)
f[i][j]=(f[i-j][j]+f[i-j][j-1])%mod;
if(i>n)
f[i][j]=(f[i][j]-f[i-n-1][j-1]+mod)%mod;
}
for(int i=1;i<=n*m;i++)
for(int j=1;j<=m;j++)
{
ans=(ans+f[i][j]*f[i][m-j])%mod;
if(j!=m)
ans=(ans+f[i][j]*f[i][m-j-1])%mod;
}
printf("%d\n",ans+(m==1));
}
return 0;
}
最新文章
- 高通AR和友盟SDK的AndroidManifest.xml合并
- APIJSON,让接口见鬼去吧!
- ytu 1059: 判别该年份是否闰年(水题,宏定义)
- 数据结构之图 Part3 – 2 遍历
- 全面了解 Linux 服务器 - 4. 查看 Linux 系统的平均负载
- Matlab验证公式取值范围
- chart.js 示例
- Qt5.8以上版本编译Oracle数据库的OCI驱动教程
- ansible服务部署与使用
- tomcat安装启动startup.bat文件命令行界面出现乱码的问题解决
- JavaScript基础回顾一(类型、值和变量)
- 最全,可直接用的一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等。
- Java程序员从阿里拿到offer回来,这些面试题你会吗?
- 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面
- dbdeployer 快速安装MySQL8.0各测试环境
- kafka definitive guide - reading notes
- 深入理解Linux内核-虚拟文件系统
- linux shell 随机字符生成单词
- Dynomite 安装配置
- 接口与协议学习笔记-AMBA片上通信协议_APB_AHB_AXI_AXI4不同版本(二)
热门文章
- Flex设置PopUpManager创建modal(模态)窗口的背景样式
- typeof、constructor和instanceof
- SQL SERVER 2012 第五章 创建和修改数据表 の CREATE语句
- Fibonacci--poj3070(矩阵快速幂)
- Wannafly挑战赛1
- ubuntu 16.04上安装php5.6
- Centos 6.x 安装Nagios及WEB管理nagiosql实现windows及linux监控指南
- BZOJ 1005 明明的烦恼 Prufer序列+组合数学+高精度
- 五分钟搭建 Flash 视频直播站
- Jenkins系列之-—04 配置用户和权限控制