(紀中)1966. 棋盤(chess)【數學(找規律)】

(File IO): input:chess.in output:chess.out
時間限制: 1000 ms 空間限制: 128001 KB 具體限制
Goto ProblemSet


題目描述
給定一個NMN*M的棋盤,每個格子裏最多隻可以放置一個棋子,求有多少种放置方案使得任意222*2的正方形區域內恰有22個棋子。


輸入
棋盤的長與寬 NN MM

輸出
一個整數,代表可行的方案數。


樣例輸入
2 2

樣例輸出
6


數據範圍限制
對於3030%的數據 N,M<=20N,M<=20
對於100100%的數據 N,M<=10000N,M<=10000


解題思路
巨老們都說公式就是2N+2M22^N+2^M-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]);
	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章