标签:des style blog color io os ar for sp
2 3
1 1
找规律的问题,分开0和1的衍生问题就好理解了。
#include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #include <limits.h> #include <stack> #include <queue> #include <set> #include <map> using namespace std; const short MAX_N = 1001; vector<short> tbl0[MAX_N], tbl1[MAX_N];//inverse saved numbers void addLargeNum(vector<short> &rs, vector<short> &a, vector<short> &b) { int n = (int)a.size(), m = (int)b.size(); rs.clear(); short carry = 0; for (int i = 0, j = 0; i < n || j < m || carry; i++, j++) { short an = i < n ? a[i] : 0; short bn = j < m ? b[i] : 0; carry += an + bn; rs.push_back(carry % 10); carry /= 10; } } void plusOne(vector<short> &a) { if (a.empty()) a.push_back(1); else { int i = 0; while (i < (int)a.size() && 9 == a[i]) a[i++] = 0; if (i == (int)a.size()) a.push_back(1); else a[i]++; } } void getTbl() { tbl0[0].push_back(0); tbl0[1].push_back(0); tbl1[0].push_back(0); tbl1[1].push_back(0); for (int i = 2; i < MAX_N; i++) { addLargeNum(tbl0[i], tbl1[i-1], tbl0[i-1]); addLargeNum(tbl1[i], tbl0[i-1], tbl1[i-1]); if (!(i&1)) plusOne(tbl1[i]); } } int main() { getTbl(); int n; while (scanf("%d", &n) != EOF) { vector<short> &a = tbl1[n]; short m = (short)tbl1[n].size(); for (short i = m-1; i >= 0; i--) { printf("%d", a[i]); } putchar('\n'); } return 0; }
HDU Computer Transformation1041 题解
标签:des style blog color io os ar for sp
原文地址:http://blog.csdn.net/kenden23/article/details/39997749