POJ 2229-Sumsets(把n拆分为2的幂相加的拆分种数)
来源:互联网 发布:大数据hadoop教程 编辑:程序博客网 时间:2024/05/10 00:31
题目地址:POJ 2229
题意:给定一个正整数,求有多少种方法把它写成若干个2幂次的和
思路:可以用递推,对于一个整数n,分为奇数和偶数,我们应该分情况讨论。
1.如果为奇数,那么在这个表示中一定含有一个1,把这个1减去,就是n-1
即dp[n]=dp[n-1]。
2.如果为偶数,那么也分两种情况,有1和没1。对于有1的情况可以直接拆出两个1,然后变为n-2的情况。对于没有1的情况可以直接将其转化为n/2,因为n拆分出所有的数字都是2的倍数,只需要将每种拆分结果中的数字都除以2就会与n/2的一种拆分相对应。
#include <stdio.h>#include <math.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <sstream>#include <algorithm>#include <set>#include <queue>#include <stack>#include <map>#include <bitset>#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;typedef __int64 LL;const int inf=0x3f3f3f3f;const double pi= acos(-1.0);const double esp=1e-6;using namespace std;const int Maxn=1e6+10;const int mod=1000000000;int dp[Maxn];int main(){ int n; dp[1]=1; dp[2]=2; for(int i=3;i<Maxn;i++) { if(i&1) dp[i]=dp[i-1]%mod; else dp[i]=(dp[i-2]+dp[i>>1])%mod; } while(~scanf("%d",&n)){ printf("%d\n",dp[n]); } return 0;}
1 0
- POJ 2229-Sumsets(把n拆分为2的幂相加的拆分种数)
- 拆分为2的幂的和的种数
- N的拆分
- 把数字拆分成2的幂的和
- 把输入整数拆分为连续的正整数之和
- 把一个List拆分为几个大小一样的List
- 把一个List拆分为几个大小一样的List
- 把一个List拆分为几个大小一样的List
- 将整数m拆分为n个数字的有序拆分方案数为C(m-1,n-1)
- 整数的拆分2
- 接上面的拆分图片,这个是把刚才拆分的图片重新合成为原图片
- 正整数n的k拆分问题
- 拆分n个符号的方法
- UVA 10168 把一个数n拆分成4个质数的和
- sass实战演练06 - 把布局拆分为12列(2):拆分和偏移
- Word Break II 求把字符串拆分为字典里的单词的所有方案 @LeetCode
- 将整数拆分为勾股数的问题解决
- 拆分list为固定大小的集合
- Linux Shell高级技巧
- BZOJ3668: [Noi2014]起床困难综合症|2进制拆分|贪心
- linux下安装安装pcre configure: error: You need a C++ compiler for C++ support
- 博弈简单题目
- java Cookie详解
- POJ 2229-Sumsets(把n拆分为2的幂相加的拆分种数)
- 黑马程序员--对象和方法之间的关系
- HDU 5293(Tree chain problem-树链剖分)
- UVa 1225 Digit Counting
- Java数据结构-二叉查找树续以及平衡二叉查找树
- 算法分析-如何实现字符串的反转
- java导出pdf文档
- 决策理论(Decision theory)&自动规划和调度(Automated planning and scheduling)(双语)
- JUnit(4)单元测试利器 JUnit 4