码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2229 Sumsets(递推,思考)

时间:2016-03-28 18:44:12      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

/*

n = 7
1) 1+1+1+1+1+1+1
2) 1+1+1+1+1+2
3) 1+1+1+2+2
4) 1+1+1+4
5) 1+2+2+2
6) 1+2+4
*/

/*
若i为偶数 : 若有 1 ,至少有两个 ---->f[i-2]的情况+两个1,
若没有1 , 将偶数分解/2-----> f[i/2];
则dp[i] = dp[i / 2] + dp[i-2]

若i为奇数: 必定有 1,
dp[i] = 减去1的序列,加上1
则dp[i] = dp[i – 1]
*/

 

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 
 5 #include<string> 
 6 #include<vector>
 7 #include<set>
 8 #include<map>
 9 #include<queue>
10 #include<math.h>
11 
12 #include<algorithm>
13 #include<iostream>
14 
15 const int INF = 0x7f7f7f7f;
16 using namespace std;
17 typedef long long ll;
18 
19 int dp[1000005];
20 int main(){
21 
22     /*
23         若i为偶数 : 若有  1 ,至少有两个    ---->f[i-2]的情况+两个1, 
24                     若没有1 , 将偶数分解/2-----> f[i/2];
25           则dp[i] = dp[i / 2] + dp[i-2]
26            
27           若i为奇数: 必定有 1, 
28             dp[i] = 减去1的序列,加上1 
29           则dp[i] = dp[i – 1]   
30     */
31     int n;
32     dp[0] = 0;
33     dp[1] = 1;
34     dp[2] = 2;
35     for(int i = 3 ; i <= 1000000 ; i ++){
36         if(i&1) dp[i] = dp[i-1]%1000000000;
37         else dp[i] = (dp[i-2]+dp[i/2])%1000000000;
38     }
39     while(scanf("%d",&n) != EOF && n){
40         printf("%d\n",dp[n]%1000000000);
41     }
42     
43     return 0;
44 }

 

POJ 2229 Sumsets(递推,思考)

标签:

原文地址:http://www.cnblogs.com/zstu-jack/p/5329965.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!