poj - 2506 Tiling--递推

来源:互联网 发布:windows 2008 pe iso 编辑:程序博客网 时间:2024/04/29 19:45
In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles?
Here is a sample tiling of a 2x17 rectangle.

Input

Input is a sequence of lines, each line containing an integer number 0 <= n <= 250.

Output

For each line of input, output one integer number in a separate line giving the number of possible tilings of a 2xn rectangle.

Sample Input

2812100200

Sample Output

317127318451004001521529343311354702511071292029505993517027974728227441735014801995855195223534251大数加法,抵退公式f(n) = f(n-1) + f(n-2)*2;
#include<stdio.h>#include<string.h>#include<stdlib.h>struct node{        int len;        int s[300];}ls[255];void dasu(int n){        int i ,c = 0;        ls[n] = ls[n-2];        for(i = 0; i < 300; i++)        {                ls[n].s[i] += (ls[n-2].s[i] + c);                c = ls[n].s[i]/10;                ls[n].s[i] %=10;        }         for(i = 0; i < 300; i++)        {                ls[n].s[i] += (ls[n-1].s[i] + c);                c = ls[n].s[i]/10;                ls[n].s[i] %=10;        }        for(i = 300; i >= 0; i--)        {                if(ls[n].s[i] != 0)                        break;        }        ls[n].len = i + 1;}int main(){        int n; int i;        ls[0].s[0] = 1;        ls[0].len = 1;        ls[1].s[0] =1;        ls[1].len = 1;        ls[2].s[0] = 3;        ls[2].len = 1;        ls[3].s[0] = 5;        ls[3].len = 1;        for(i = 4; i <= 250; i++)        {                dasu(i);        }        while(~scanf("%d",&n))        {            for(i = ls[n].len-1;i >= 0; i--)            {                    printf("%d",ls[n].s[i]);            }            printf("\n");        }        return 0;}


0 0