(纪中)1966. 棋盘(chess)【数学(找规律)】

119 篇文章 0 订阅

(File IO): input:chess.in output:chess.out
时间限制: 1000 ms 空间限制: 128001 KB 具体限制
Goto ProblemSet


题目描述
给定一个 N ∗ M N*M NM的棋盘,每个格子里最多只可以放置一个棋子,求有多少种放置方案使得任意 2 ∗ 2 2*2 22的正方形区域内恰有 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+2M2。。。(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]);
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值