华为oj 之 整数分隔

/*
(1)如果是奇数:
	dp[i] = dp[i-1]
	相当于在(i-1)每个分隔的前面添了一个1
 
(2)如果是偶数:
	dp[i] = dp[i-1] + dp[i/2]
	相当于在(i-1)每个分隔的前面添了一个1,同时(i/2)的每个分隔乘以2
eg:
2:
	1 1
	2
3:
	1 1 1
	1 2
4:
	1 1 1 1
	1 1 2
	2 2
	4
*/
 1 #include <iostream>
 2 #include <fstream>
 3 #include <sstream>
 4 #include <cstdlib>
 5 #include <cstdio>
 6 #include <cstddef>
 7 #include <iterator>
 8 #include <algorithm>
 9 #include <string>
10 #include <locale>
11 #include <cmath>
12 #include <vector>
13 #include <cstring>
14 #include <map>
15 #include <utility>
16 #include <queue>
17 #include <stack>
18 #include <set>
19 #include <functional>
20 using namespace std;
21 typedef pair<int, int> PII;
22 typedef long long int64;
23 const int INF = 0x3f3f3f3f;
24 const int modPrime = 3046721;
25 const double eps = 1e-9;
26 const int MaxN = 1000010;
27 const int MaxM = 30;
28 const int Mod = 1000000000;
29 const char Opt[4] = { '+', '-', '*', '/' };
30 
31 
32 int dp[MaxN];
33 
34 void Solve(int n)
35 {
36     dp[0] = 0;
37     dp[1] = 1;
38     for (int i = 2; i < n; ++i)
39     {
40         if (i & 1)
41         {
42             dp[i] = dp[i - 1];
43         }
44         else
45         {
46             dp[i] = (dp[i - 1] + dp[i / 2]) % Mod;
47         }
48     }
49 }
50 
51 
52 int main()
53 {
54 #ifdef HOME
55     freopen("in", "r", stdin);
56     //freopen("out", "w", stdout);
57 #endif
58     
59     Solve(MaxN);
60     int n;
61     while (cin >> n)
62     {
63         if (n > 1000000 || n < 0)
64         {
65             cout << -1 << endl;
66             continue;
67         }
68         cout << dp[n] << endl;
69     }
70 
71 #ifdef HOME
72     cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
73     _CrtDumpMemoryLeaks();
74 #endif
75     return 0;
76 }

 



posted @ 2016-01-11 21:35  JmingS  阅读(332)  评论(0编辑  收藏  举报