当前位置 : 主页 > 编程语言 > c语言 >

POJ 2506 Tiling

来源:互联网 收集:自由互联 发布时间:2023-09-07
Tiling Time Limit:1000MS Memory Limit:65536K Total Submissions:7679 Accepted:3734 Description 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


Tiling


Time Limit: 1000MS

 

Memory Limit: 65536K

Total Submissions: 7679

 

Accepted: 3734


Description


In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles? 

Here is a sample tiling of a 2x17 rectangle. 




POJ 2506   Tiling_Memory



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


28 12 100 200


Sample Output


3171 2731 845100400152152934331135470251 1071292029505993517027974728227441735014801995855195223534251


Source


The UofA Local 2000.10.14






规律很好找。q[i] = q[i-1] + q[i-2] * 2;


找到规律之后大数相加就可以了。






#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct node
{
    int len;
    int a[1000];
}q[1000];
int n;

int maxx(int aa,int bb)
{
    if(aa>bb)
    {
        return aa;
    }
    else
    {
        return bb;
    }
}

void ji(node &p)
{
    for(int i=0;i<p.len;i++)
    {
        p.a[i] = p.a[i] * 2;
    }
    for(int i=0;i<p.len;i++)
    {
        if(p.a[i]>9)
        {
            p.a[i] = p.a[i] - 10;
            p.a[i+1]++;
        }
    }
    if(p.a[p.len]!=0)
    {
        p.len++;
    }
}

void he(node x,node y,node &z)
{
    int m = maxx(x.len,y.len);
    for(int i=0;i<m;i++)
    {
        z.a[i] = x.a[i] + y.a[i];
    }
    for(int i=0;i<m;i++)
    {
        if(z.a[i]>9)
        {
            z.a[i] = z.a[i] - 10;
            z.a[i+1]++;
        }
    }
    if(z.a[m]!=0)
    {
        z.len = m + 1;
    }
    else
    {
        z.len = m;
    }
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(q,0,sizeof(q));
        q[0].len = 1;
        q[0].a[0] = 1;
        q[1].len = 1;
        q[1].a[0] = 1;
        for(int i=2;i<=n;i++)
        {
            ji(q[i-2]);
            he(q[i-2],q[i-1],q[i]);
        }
        for(int i=q[n].len-1;i>=0;i--)
        {
            printf("%d",q[n].a[i]);
        }
        printf("\n");
    }
    return 0;
}


【感谢龙石为本站数据质量管理平台提供技术支撑 http://www.longshidata.com/pages/quality.html】
上一篇:POJ2240 Arbitrage(最短路)
下一篇:没有了
网友评论