棋盘覆盖(大数问题)

时间:2023-02-11 11:02:44

棋盘覆盖
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的2×2方格(图2为其中缺右下角的一个),去覆盖2k×2k未被覆盖过的方格,求需要类似图2方格总的个数s。如k=1时,s=1;k=2时,s=5

输入
第一行m表示有m组测试数据;
每一组测试数据的第一行有一个整数数k;
输出
输出所需个数s;

样例输入
3
1
2
3

样例输出 1 5 21

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

void mult(int *p,int n, int *bit)
{
    int s=0, c=0;
    int i;
    for(i=0;i<*bit;++i)
    {
        s = p[i]*n+c;
        p[i] = s%10;
        c = s/10;
    }

    if(c)
    {
        p[*bit] = c;
        ++(*bit);
    }


}

void add(int *p,int *t, int*bit)
{
    int i;
    for(i=0;i<*bit;++i)
    {
        t[i] = p[i]+t[i];
        t[i+1] = t[i+1]+t[i]/10;
        t[i] = t[i]%10; 



    }
    if(t[i]){

        ++(*bit);
    }


 } 



int main()
{
    int n,k,i,bit;
    int tmp[100];//存放每一项的值
    int sum[100];//计算结果 
    scanf("%d",&n);

   while(n--)
   {
        memset(tmp,0,sizeof(tmp));
        memset(sum,0,sizeof(sum));
        scanf("%d",&k);
        tmp[0] = 1;
        sum[0] = 1;

        bit =  1;

        for(i=1;i<k;i++)
        {
            mult(tmp,4,&bit);
            add(tmp,sum,&bit);

           }

           for(i=bit-1;i>=0;i--)
           {
            printf("%d",sum[i]);
           }
           printf("\n");
}


    return 0;

 }