poj 2229
2015-09-09 15:04
489 查看
这道题目属于比较典型的递推。
如果一个数i是奇数,我们可以发现,它的组合方法跟i-1肯定是一样的,就相当于在每个i-1方法的后面+1,就可以组合为i.
如果一个数i是偶数,我们就得分类:
1.如果组合方法中有1,那么肯定有偶数个1,也就是我们在i-2的后面+1+1,形成了i.
2.如果组合方法中没有1,那么全部都是偶数,我们只需将所有i/2的组合方法全部*2即可。
举个例子:
比如4,那我们知道的是
3 = 1+1+1
3 = 1+2
2 = 1+1
2 = 2
那么4的组合方法就有4种,分别对应
4 = 1+1+1+1(3+1)
4 = 1+2+1 (3+1)
4 = 2+2(2*2)
4 = 4(2*2)
题目中还隐含了一个要取余的条件,即它说输出9位数,mod 1e9
如果一个数i是奇数,我们可以发现,它的组合方法跟i-1肯定是一样的,就相当于在每个i-1方法的后面+1,就可以组合为i.
如果一个数i是偶数,我们就得分类:
1.如果组合方法中有1,那么肯定有偶数个1,也就是我们在i-2的后面+1+1,形成了i.
2.如果组合方法中没有1,那么全部都是偶数,我们只需将所有i/2的组合方法全部*2即可。
举个例子:
比如4,那我们知道的是
3 = 1+1+1
3 = 1+2
2 = 1+1
2 = 2
那么4的组合方法就有4种,分别对应
4 = 1+1+1+1(3+1)
4 = 1+2+1 (3+1)
4 = 2+2(2*2)
4 = 4(2*2)
题目中还隐含了一个要取余的条件,即它说输出9位数,mod 1e9
#include<stdio.h> #include<iostream> #include<string> #include<string.h> #include<algorithm> #include<iomanip> #include<vector> #include<time.h> #include<queue> #include<stack> #include<iterator> #include<math.h> #include<stdlib.h> #include<limits.h> #include<map> #include<set> #include<bitset> //#define ONLINE_JUDGE #define eps 1e-8 #define INF 0x7fffffff #define FOR(i,a) for((i)=0;i<(a);(i)++) #define MEM(a) (memset((a),0,sizeof(a))) #define sfs(a) scanf("%s",a) #define sf(a) scanf("%d",&a) #define sfI(a) scanf("%I64d",&a) #define pf(a) printf("%d\n",a) #define pfI(a) printf("%I64d\n",a) #define pfs(a) printf("%s\n",a) #define sfd(a,b) scanf("%d%d",&a,&b) #define sft(a,b,num) scanf("%d%d%d",&a,&b,&num) #define for1(i,a,b) for(int i=(a);i<b;i++) #define for2(i,a,b) for(int i=(a);i<=b;i++) #define for3(i,a,b)for(int i=(b);i>=a;i--) #define MEM1(a) memset(a,0,sizeof(a)) #define MEM2(a) memset(a,-1,sizeof(a)) #define ll __int64 const double PI=acos(-1.0); template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;} template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;} template<class T> inline T Min(T a,T b){return a<b?a:b;} template<class T> inline T Max(T a,T b){return a>b?a:b;} using namespace std; //#pragma comment(linker,"/STACK:1024000000,1024000000") int n,m; #define M 110 #define N 1000010 #define Mod 1000000000 #define p(x,y) make_pair(x,y) const int MAX_len=550; int a ; void Init(){ a[1] = 1; a[2] = 2; for(int i=3;i<N;i++){ if(i&1) a[i] = a[i-1]; else a[i] = (a[i-2]+a[i/2])%Mod; } } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif Init(); while(sf(n)!=EOF){ pf(a ); } return 0; }
相关文章推荐
- Effective Java 创建和销毁对象
- CentOS 6 下启动ORACLE 11gR2
- 详解CSS3特性@Media如何实现响应式设计
- ALM11需求和测试覆盖率图解1
- LinkedList 链表
- HTML/CSS(五)HTML5服务器推送事件
- 摄像机标定中用到的函数
- Hdu 1025 Constructing Roads In JGShining's Kingdom 最大上升子序列nlogn算法
- iOS图像拉伸解决方案
- myql_链接丢失异常_mybaits _等框架_报错_The last packet successfully
- Oracle语句优化之一
- ogg
- php-leveldb 扩展安装 和使用
- 反向传导算法
- 有用但多疑的十大Java编程技术
- shell 二维数组
- ppt画笔标记在哪里|ppt中画笔工具功能怎么用?
- 圆形头像设置Android 原代码
- Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍
- iOS学习笔记26-iOS中Cookie的使用和解析