HDU 2709 Sumset DP 二进制
题意
- 给我们一个整数k,要求我们将k分成若干个二的整数幂(1, 2, 4, 8...)的加和形式,问我们所有的分法中,本质不同(即某个2的幂的数量不同)的形式有多少种,k最多为1000000,输出答案的后9位数
思路
由k范围,我们寻找线性算法,可以从题中给出的k == 7的例子来分析,如下图

可以看到,由于7余2等于1,而1不可分解,所以每一行都有一个1,所以显然,我们如果给7减去1之后,结果将仍然是6种,所以我们可以发现,k为奇数时的结果就是k - 1的结果。
然后我们抛开最左边的一列1,从下往上看可以发现,第5 6行的所有数可以都除以2,然后得((1 1 1),(1 2)),这正是3的分解结果
而再往上看1234行,我们发现左边两列都是1,可以看做是第五行中,一个2分解的结果,于是忽略这两列,然后可以发现,从(1,1,1,1)到(4)正是4的分解结果,也就是6 - 2(因为忽略了两行1)的结果
考虑k等于其他偶数时,我们可以发现上述情况是一定会有的 —— 我们总是会分出一个最小值为2的序列,然后这个序列总体除以2,就是k / 2的分解结果,然后我们将其中的一个2分解为2个1, 然后剩下的就是k - 2的分解结果,这样就包含了全部情况了
所以k为奇数时, F[k] = F[k - 1]的答案,而k为偶数时,F[k] = F[k >> 1] + F[k - 2]
提示
这道题有提到single line,但是仍然有多组数据
虽然题目要求后9位,但是在此题中直接%1e9是没有问题的,可能是出题人没有想到
AC代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) (x&(-x))
using namespace std;
const long long modd = 1000000000;
long long ff[1000005];
int n;
int main()
{
ff[0] = 1;
for (long long j = 1; j <= 1000000; ++j)
{
if (j & 1)
{
ff[j] = ff[j - 1];
}
else
{
ff[j] = ((ff[j] + ff[j - 2]) % modd + ff[j >> 1]) % modd;
}
}
while (scanf("%d", &n) == 1)
{
printf("%lld\n", ff[n]);
}
return 0;
}
HDU 2709 Sumset DP 二进制的更多相关文章
- HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- hdu 3709 数字dp(小思)
http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...
- hdu 4283 区间dp
You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
- HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包)
HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包) 题意分析 与普通的完全背包大同小异,区别就在于多了一个个数限制,那么在普通的完全背包的基础上,增加一维,表示个数.同时for循环 ...
- HDOJ(HDU).1114 Piggy-Bank (DP 完全背包)
HDOJ(HDU).1114 Piggy-Bank (DP 完全背包) 题意分析 裸的完全背包 代码总览 #include <iostream> #include <cstdio&g ...
随机推荐
- FFMPEG+SDL简单视频播放器——视频快进
之前写过一篇关于视频播放器的文章.播放器只简单实现了视频播放的功能,在此功能的基础上,给它加上一个视频快进的功能. 实现 添加参数 // video play control bool do_seek ...
- Vue项目打包为桌面应用
vue项目首先使用 npm run build 打包为dist文件后,进入dist目录得到如下文件:就是打包后的html+css+js+static 新建一个deskapp文件夹,里面在新建一个App ...
- CSP 2022 游记
赛前占坑. 由于不知是 \(Day ?\) 故采用日期方式记录. 文笔所限,闲话较多,略显杂乱. 09.?? 接到通知,LN 初赛线上.面基环节无了/kk 09.17 翘 whk 和数学统练参加多校联 ...
- DP:按摩师(3.24leetcode每日打卡)
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接.在每次预约服务之间要有休息时间,因此她不能接受相邻的预约.给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回 ...
- 如何使用JavaScript 将数据网格绑定到 GraphQL 服务
前言 作为一名前端开发人员,GraphQL对于我们来说是令人难以置信的好用.它可以用来简化数据访问,这让我们的工作变得更加容易. 什么是 GraphQL?它是一个抽象层,位于任意数量的数据源之上,并为 ...
- 【Android】Android Bmob后端云配置
简介 开发一个具有网络功能的应用,在Bmob移动应用云存储平台中,只需要注册一个账号,就可以实现申请创建任意多个数据库,获得对应的key,下载对应版本的SDK,并嵌入到移动应用中,调用存取的KPI,进 ...
- 常见速率协议的CDR带宽情况
100G PAM4 4MHZ 802.3/OIF-CEI 50G PAM4 4MHZ 802.3/OIF-CEI 28G PAM4 4MHZ 802.3/OIF-CEI 28G PAM4 4MHZ 8 ...
- tomact
常见的java相关的web服务器软件: *webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费. *webSphere:IBM公司,大型的JavaEE ...
- CICD实践1:环境安装篇
一.CICD技术选型 配置管理工具 工具 需求管理工具 使用禅道 代码管理工具 使用Gitlab 编译构建工具 搭建Jenkins,使用Jenkinsfile 制品库工具 nexus 文档管理工具 C ...
- IDEA配置自定义标签,实现高亮注释~
为什么要写这么一篇博客呢? 不知道大家有没有这样的一种苦恼,就是在写代码的时候遇到复杂的核心的代码,想加一个特殊的注释方便后期自己或者同事查看,但是这玩意IDEA好像只给我们提供了两个 FIXME : ...