hdu Tiling_easy version

想了半天,一个个写出来找规律太麻烦,于是去网站找解析,说是模拟下过程打出答案,自己也试着模拟了一下

模拟程序如下:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
long long i,j,num,x,y,n,m,a[200];
int dfs(long long z)
{
    long long k;
    if(z==i)
    {
    num++;
    return;
    }
    if(z>i)
    return;
    else
    for(k=1;k<=3;k++)
    {
        if(k==1)
        dfs(z+1);
        else
        dfs(z+2);
    }
    return;
}
int main()
{
    for(i=1;i<30;i++)
    {
        num=0;
        for(j=1;j<=3;j++)
        {
            if(j==1)
            dfs(1);
            else
            dfs(2);
        }
        a[i]=num;
    }
    for(x=1;x<30;x++)
    printf("%I64d\n",a[x]);
}

这程序要跑一会儿,不想等的改成20
发现f[n]=2f[n]+1(-1)(1或者-1两者之间波动)
数据如下:
1
3
5
11
21
43
85
171
341
683
1365
2731
5461
10923
21845
43691
87381
174763
349525
699051
1398101
2796203
5592405
11184811
22369621
44739243
89478485
178956971
357913941
715827883

我直接打表
于是写出程序:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
long long a[50]={1,3,5,11,21,43,85,171,341,683,1365,2731,5461,
10923,21845,43691,87381,174763,349525,699051,
1398101,2796203,5592405,11184811,22369621,44739243,
89478485,178956971,357913941,715827883};
int main()
{   int n,k;
    while(scanf("%d",&n)!=EOF)
    {
    while(n--)
        {
            scanf("%d",&k);
            printf("%I64d\n",a[k-1]);
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值