棋盘覆盖
时间限制: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;
}