(File IO): input:chess.in output:chess.out
时间限制: 1000 ms 空间限制: 128001 KB 具体限制
Goto ProblemSet
题目描述
给定一个
N
∗
M
N*M
N∗M的棋盘,每个格子里最多只可以放置一个棋子,求有多少种放置方案使得任意
2
∗
2
2*2
2∗2的正方形区域内恰有
2
2
2个棋子。
输入
棋盘的长与宽
N
N
N
M
M
M
输出
一个整数,代表可行的方案数。
样例输入
2 2
样例输出
6
数据范围限制
对于
30
30%
30的数据
N
,
M
<
=
20
N,M<=20
N,M<=20
对于
100
100%
100的数据
N
,
M
<
=
10000
N,M<=10000
N,M<=10000
解题思路
巨老们都说公式就是
2
N
+
2
M
−
2
2^N+2^M-2
2N+2M−2。。。(PS:西米鬼鬼)
然后套一下高精度就可以了。
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,m,a[10010],b[10010],c[10020],t,t1,t2,x,i1;
int main()
{
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
scanf("%d%d",&n,&m);
t=1;
a[1]=1;
for(int i=1;i<=n;i++)
{
x=0;
for(int j=1;j<=t;j++)
{
a[j]=a[j]*2+x;
x=a[j]/10;
a[j]=a[j]%10;
a[t+1]=x;
}
if(a[t+1]>0)
t++;
}
t1=0;
b[1]=1;
for(int i=1;i<=m;i++)
{
x=0;
for(int j=1;j<=t;j++)
{
b[j]=b[j]*2+x;
x=b[j]/10;
b[j]=b[j]%10;
b[t+1]=x;
}
if(b[t+1]>0)
t++;
}
a[1]=a[1]-2;
i1=1,x=0;
while((i1<=t)||(i1<=t1))
{
c[i1]=a[i1]+b[i1]+x;
x=c[i1]/10;
c[i1]=c[i1]%10;
i1=i1+1;
}
if(x>0)
{
t2=i1;
c[i1]=x;
}
else t2=i1-1;
for(int i=t2;i>0;i--)
printf("%d",c[i]);
}