棋盘覆盖
时间限制: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
图2
- 输入
- 第一行m表示有m组测试数据;
每一组测试数据的第一行有一个整数数k; 输出 - 输出所需个数s; 样例输入
-
3 1 2 3
样例输出 -
1 5 21
1 /* 功能Function Description: NYOJ-45 2 开发环境Environment: DEV C++ 4.9.9.1 3 技术特点Technique: 4 版本Version: 5 作者Author: 可笑痴狂 6 日期Date: 20120821 7 备注Notes: 8 本题求的是大数(4^k-1)/3,可以转化为首项为1,公比为4的等比数列的前k项的和 9 把除法转化为加法和乘法。 10 */ 11 #include<stdio.h> 12 #include<string.h> 13 14 void mult(int *tmp,int num,int &bit) 15 { 16 int t=0; 17 for(int i=0;i<bit;++i) 18 { 19 t=tmp[i]*num+t; 20 tmp[i]=t%10; 21 t/=10; 22 } 23 if(t) 24 { 25 tmp[bit]=t; 26 ++bit; 27 } 28 } 29 30 void add(int *sum,int *tmp,int &bit) 31 { 32 int i,t=0; 33 for(i=0;i<bit;++i) 34 { 35 sum[i]+=tmp[i]; 36 sum[i+1]+=sum[i]/10; 37 sum[i]%=10; 38 } 39 if(sum[i]) 40 ++bit; 41 } 42 43 int main() 44 { 45 int k,T,i,bit; 46 int tmp[100]; //存放每一项的值 47 int sum[100]; //存放结果 48 scanf("%d",&T); 49 while(T--) 50 { 51 memset(tmp,0,sizeof(tmp)); 52 memset(sum,0,sizeof(sum)); 53 scanf("%d",&k); 54 tmp[0]=1; 55 sum[0]=1; 56 bit=1; 57 for(i=1;i<k;++i) 58 { 59 mult(tmp,4,bit); 60 add(sum,tmp,bit); 61 } 62 for(i=bit-1;i>=0;--i) 63 printf("%d",sum[i]); 64 printf("\n"); 65 } 66 return 0; 67 }