NYOJ45 棋盘覆盖

 

棋盘覆盖

时间限制: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

                                                                                    

 

图1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                             图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 }
功不成,身已退
原文地址:https://www.cnblogs.com/dongsheng/p/2648797.html