|
Asif is a student of East West University and he is currently working for the EWUISP to meet his relatively high tuition fees. One day, as a part of his job, he was instructed to connect cable wires to N houses. All the houses lie in a straight line. He wants to use only the minimum number of cable wires required to complete his task such that all the houses receive the cable service. A house can either get the connection from the main transmission center or it can get it from a house to its immediate left or right provided the latter house is already getting the service.
You are to write a program that determines the number of different combinations of the cable wires that is possible so that every house receives the service.
Example: If there are two houses then 3 combinations are possible as shown in the figure.
Figure: circles represent the transmission center and the small rectangles represent the houses.
Input
Each line of input contains a positive integer N (N<=2000). The meaning of N is described in the above paragraph. A value of 0for N indicates the end of input which should not be processed.
Output
For each line of input you have to output, on a single line, the number of possible arrangements. You can safely assume that this number will have less than 1000 digits.
Sample Input
1 |
Sample Output
1 |
参考了 http://www.cnblogs.com/staginner/archive/2011/12/15/2288868.html
代码:
#include <stdio.h> #include <string.h> #define max(a,b) (a)>(b)?(a):(b) #define min(a,b) (a)<(b)?(a):(b) const int N = 1005; const int MAXBIGN = 1005; struct bign { int s[MAXBIGN]; int len; bign() { len = 1; memset(s, 0, sizeof(s)); } bign operator = (const char *number) { len = strlen(number); for (int i = 0; i < len; i++) s[len - i - 1] = number[i] - '0'; return *this; } bign operator = (const int num) { char number[N]; sprintf(number, "%d", num); *this = number; return *this; } bign (int number) {*this = number;} bign (const char* number) {*this = number;} bign operator + (const bign &c){ bign sum; int t = 0; sum.len = max(this->len, c.len); for (int i = 0; i < sum.len; i++) { if (i < this->len) t += this->s[i]; if (i < c.len) t += c.s[i]; sum.s[i] = t % 10; t /= 10; } while (t) { sum.s[sum.len++] = t % 10; t /= 10; } return sum; } bign operator * (const bign &c){ bign sum; bign zero; if (*this == zero || c == zero) return zero; int i, j; sum.len = this->len + c.len; for (i = 0; i < this->len; i++) { for (j = 0; j < c.len; j ++) { sum.s[i + j] += this->s[i] * c.s[j]; } } for (i = 0; i < sum.len; i ++) { sum.s[i + 1] += sum.s[i] / 10; sum.s[i] %= 10; } sum.len ++; while (!sum.s[sum.len - 1]) { sum.len --; } return sum; } bign operator - (const bign &c) { bign ans; ans.len = max(this->len, c.len); int i; for (i = 0; i < c.len; i++) { if (this->s[i] < c.s[i]) { this->s[i] += 10; this->s[i + 1]--; } ans.s[i] = this->s[i] - c.s[i]; } for (; i < this->len; i++) { if (this->s[i] < 0) { this->s[i] += 10; this->s[i + 1]--; } ans.s[i] = this->s[i]; } while (ans.s[ans.len - 1] == 0) { ans.len--; } if (ans.len == 0) ans.len = 1; return ans; } void put() { if (len == 1 && s[0] == 0) { printf("0"); } else { for (int i = len - 1; i >= 0; i--) printf("%d", s[i]); } } bool operator < (const bign& b) const { if (len != b.len) return len < b.len; for (int i = len - 1; i >= 0; i--) if (s[i] != b.s[i]) return s[i] < b.s[i]; return false; } bool operator > (const bign& b) const { return b < *this; } bool operator <= (const bign& b) const { return !(b < *this); } bool operator >= (const bign& b) const { return !(*this < b); } bool operator != (const bign& b) const { return b < *this || *this < b;} bool operator == (const bign& b) const { return !(b != *this); } }; bign f[2005]; int n; void init() { f[1] = 1; f[2] = 3; bign three = 3; for (int i = 3; i <= 2000; i ++) { f[i] = three * f[i - 1] - f[i - 2]; } } int main() { init(); while (~scanf("%d", &n) && n) { f[n].put(); printf("\n"); } return 0; }