加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

POJ 2506 Tiling ( 递推 + 大数 )

发布时间:2020-12-14 03:33:37 所属栏目:大数据 来源:网络整理
导读:题目链接:http://poj.org/problem?id=2506 ? 这个题和校赛的热身赛最后一个很类似啊,就是一个递推,还有个大数。 ? 推规律倒是不难 n = 1的时候结果是这个样子的,就一种情况 ? n = 2的时候,结果是3种情况 那么第3种呢?以及第n种,是第n - 1种加上一个2

题目链接:http://poj.org/problem?id=2506

?

这个题和校赛的热身赛最后一个很类似啊,就是一个递推,还有个大数。

?

推规律倒是不难

n = 1的时候结果是这个样子的,就一种情况

?

n = 2的时候,结果是3种情况

那么第3种呢?以及第n种,是第n - 1种加上一个2X1的矩,或者n - 2种加上一个2X2的矩阵,但因为两个并列的2X1的矩阵(一个2X2的矩阵)会和n - 1的重复,所以去掉,那么就会得出f(i) = f(i - 2) * 2 + f(i - 1);

这样就只剩下大数问题了。
代码如下:

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
int num[300][1000];
int main()
{
    int n;
    int i,k;
    memset(num,sizeof (num));

    num[0][0] = 1;
    num[1][0] = 3;

    for (i = 2;i < 251;i++)
    {
        for (k = 0;k < 1000;k++)
            num[i][k] = num[i - 1][k] + num[i - 2][k] * 2;

        for (k = 0;k < 1000;k++)
            if (num[i][k] >= 10)
            {
                num[i][k + 1] += num[i][k] / 10;
                num[i][k] %= 10;
            }
    }

    while (~scanf ("%d",&n))
    {
        if (n == 0)
        {
            printf ("1n");
            continue;
        }
        for (i = 999;i >= 0;i--)
            if (num[n - 1][i] != 0)
                break;

        for (;i >= 0;i--)
            printf ("%d",num[n - 1][i]);

        printf ("n");
    }
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读