博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ2229 Sumsets
阅读量:6581 次
发布时间:2019-06-24

本文共 1097 字,大约阅读时间需要 3 分钟。

题目:

题目大意:就是拆分n 每一位都得是2的幂。 

注意4 :1111    112   22   4   一共4种

递推:

对于n可以分为是奇数还是偶数

奇数:肯定有1,  和去掉一个1的情况一样  所以 dp[i] = dp[i-1]

偶数:有1的话,肯定有两个1,dp[i] = dp[i-2]    没有1的话,每一位都是2的倍数,dp[i] = dp[i/2]   总的:dp[i] = dp[i-2] + dp[i/2]

打表:

n          2    3   4  5   6   7      8      9  

sum     2    2   4  4   6   6     10    10

例如:

偶数2:   11   2

奇数3:   111   12                     去掉一个1: { 11  2 } = dp[2]   

偶数4:   1111  112   22   4

偶数6:   111111  11112    1122    222    24   114  {

               有1的情况: 111111   11112   1122   114  去掉两个1:{ 1111    112   22   4 } = dp[4]

               没有1的情况   222   24                                 除以2 :{111   12 } = dp[3]

               总的    dp[6] = dp[4] + dp[3]

               }

AC代码:

#include 
#include
#include
#include
#define MOD 1000000007using namespace std; const int maxn = 1e7+10;long long a[maxn]; void init(){ memset( a, 0, sizeof( a));} int main(){ init(); a[0] = a[1] = 1; for ( int i = 2; i <= 10000000; ++ i) { if ( i & 1) {//奇数 a[i] = a[i - 1]; } else{ a[i] = a[i / 2] % MOD + a[i - 2] % MOD;//注意取模 } a[i] = a[i] % MOD; } int n; while(~scanf( "%d", &n)){ cout << a[n] << endl; }}

 

转载于:https://www.cnblogs.com/ACMerszl/p/9572950.html

你可能感兴趣的文章
无法修复ie使用代理服务器
查看>>
【Apache Mina2.0开发之二】自定义实现Server/Client端的编解码工厂(自定义编码与×××)!...
查看>>
JS判断终端类型
查看>>
Exchange 2013 SP1 先决条件
查看>>
关于suid/guid
查看>>
教你给IDEA安装插件
查看>>
在windows上安装curl
查看>>
使用EasyWechat为“WX公众号”增加一个访问统计的方案实现
查看>>
数据库的工具类
查看>>
深入理解PHP Opcode缓存原理
查看>>
Spket Eclipse插件使用教程
查看>>
大端和小端(高位和低位)
查看>>
Android医药助手源码
查看>>
IPv6隧道及NAT-PT技术讲解
查看>>
解决SwipeRefreshLayout结合ListView EmptyView使用不起作用的问题
查看>>
Linux基础4 常用命令
查看>>
锚标记平滑移动
查看>>
我的友情链接
查看>>
Endian firewall
查看>>
js判断离开页面刷新或关闭的方法
查看>>