HihoCoder1076 与链(数位DP)
描述
给定 n 和 k。计算有多少长度为 k 的数组 a1, a2, ..., ak,(0≤ai) 满足:
a1 + a2 + ... + ak = n。
对于任意的 i = 0, ..., k - 1 有 ai AND ai + 1 = ai + 1。其中AND是与操作。
输入
第一行包含一个整数 T - 测试数据组数(1 ≤ T ≤ 2)。接下来的 T 行,每行包含两个整数 k 和 n (k ≤ 105, n ≤ 104)。
输出
对于每组测试数据,输出一行表示对应的答案。答案可能很大,输出模 1000000009 后的结果。
样例输入
-
2
3 2
4 2
样例输出
-
2
2
- 后一位数如果含有1<<i,则前一位也含有1<<i;即1<<i从第a[x]延续到最后a[k]。转化一下,其实就是求一个柱形图, 使得它的面积和为n。其中,每条柱子的宽分别是1<<0,1<<1....1<<14,每条柱子的高最多是min(k,n/(1<<i)),高度表示a[x]到a[k]这些数的个数。
- 注意初始化
DP代码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int Mod=;
int k,n,dp[][];
int main()
{
int T,i,j,p,ans;
scanf("%d",&T);
while(T--){
scanf("%d%d",&k,&n);
memset(dp,,sizeof(dp));
for(i=;i<=;i++) dp[][i]=;
for(i=;i<=min(n,k);i++) dp[i][]=;
//初始化 for(i=;i<=;i++)
for(j=;j<=n;j++)
for(p=;p<=min(k,j/(<<i));p++){
dp[j][i]=(dp[j][i]+dp[j-p*(<<i)][i-])%Mod;
}
printf("%d\n",dp[n][]);
}
return ;
}
附上暴力的搜索,这样就能理解了。(当然,暴力是超时的)
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int Mod=;
int k,n;
int dfs(int pos,int sum)
{ if(pos==){
if(sum==n) return ;
return ;
}int tmp=;
for(int i=;i<=min(k,(n-sum)/(<<pos));i++){
tmp=(tmp+dfs(pos+,sum+i*(<<pos)))%Mod;
}return tmp;
}
int main()
{
int T,i,j,ans;
scanf("%d",&T);
while(T--){
scanf("%d%d",&k,&n);
ans=dfs(,);
printf("%d\n",ans);
}
return ;
}
HihoCoder1076 与链(数位DP)的更多相关文章
- 区间DP,数位DP
dp(动态规划)顾名思义便是动态的一种规划,而这种规划往往会跟状态,状态转移方程,记忆化搜索扯上关系,当然DP也是各个OI考试的必考点和常考点,在毒瘤出题人的折磨下,出现了许许多多的动态规划,有线性, ...
- 背包&数位dp(8.7)
背包 0/1背包 设dp[i][j]为前i个物品选了j体积的物品的最大价值/方案数 dp[i][j]=max(dp[i-1][j-w[i]]+v[i],dp[i-1][j])(最大价值) dp[i][ ...
- 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP
[BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...
- bzoj1026数位dp
基础的数位dp 但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了) #include <bits/stdc++.h> using namespace ...
- uva12063数位dp
辣鸡军训毁我青春!!! 因为在军训,导致很长时间都只能看书yy题目,而不能溜到机房鏼题 于是在猫大的帮助下我发现这道习题是数位dp 然后想起之前讲dp的时候一直在补作业所以没怎么写,然后就试了试 果然 ...
- HDU2089 不要62[数位DP]
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 数位DP GYM 100827 E Hill Number
题目链接 题意:判断小于n的数字中,数位从高到低成上升再下降的趋势的数字的个数 分析:简单的数位DP,保存前一位的数字,注意临界点的处理,都是套路. #include <bits/stdc++. ...
- 数位dp总结
由简单到稍微难点. 从网上搜了10到数位dp的题目,有几道还是很难想到的,前几道基本都是模板题,供入门用. 点开即可看题解. hdu3555 Bomb hdu3652 B-number hdu2089 ...
- 数位DP入门
HDU 2089 不要62 DESC: 问l, r范围内的没有4和相邻62的数有多少个. #include <stdio.h> #include <string.h> #inc ...
- 数位DP之奥义
恩是的没错数位DP的奥义就是一个简练的dfs模板 int dfs(int position, int condition, bool boundary) { ) return (condition ? ...
随机推荐
- Git命令与介绍
一. Git[命令与介绍] 1. 作用 可以用于个的项目版本控制和管理 目前多用于团队间的多人协作项目开发 2. 安装 l 安装包路径 l 安装 后的路径: 3. 工作流程 (1) 创建项目目录 在路 ...
- 【HANA系列】SAP HANA SQL字符串连接操作
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL字符串连 ...
- 【Qt开发】【计算机视觉】OpenCV在Qt-MinGw下的编译库
最近电脑重装系统了,第一件事重装OpenCV.这次直接装最新版,2014-4-25日发布的OpenCV2.4.9版本,下载链接: http://sourceforge.NET/projects/ope ...
- webpack打包vue项目之后怎么启动&注意事项
参考路径:https://blog.csdn.net/cn_yaojin/article/details/80164477 参考路径:https://www.imooc.com/article/323 ...
- MHA简单部署
MHA是目前比较成熟的mysql高可用集群方式之一. 一.参考文档:1.官方文档:[ https://github.com/yoshinorim/mha4mysql-manager/wiki ]2.个 ...
- XXE漏洞简析
0x00.什么是XXE? XML外部实体注入(XML External Entity Injection) XML基础 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型. ...
- Duilib的多级菜单实现(网易云信版本)
完整代码见:https://github.com/netease-im/NIM_Duilib_Framework/tree/master/ui_components/menu 核心代码: ui_men ...
- HDU 1260 Tickets (动态规划)
Tickets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- [转帖]AMD霄龙安全加密虚拟化曝漏洞:已修复
AMD霄龙安全加密虚拟化曝漏洞:已修复 https://www.cnbeta.com/articles/tech/862611.htm 硬件的安全问题 今年初,Google的一位研究人员发现,AMD ...
- Mybatis动态SQL之使用foreach完成复杂查询
一.foreach概述 对于一些SQL语句中含有in条件.需要迭代条件集合来生产的情况,就需要使用foreach标签来实现SQL条件的迭代.foreach主要用在构建in条件中,它可以在SQL语句中迭 ...