0
点赞
收藏
分享

微信扫一扫

题解 填充棋盘

回溯 2022-02-23 阅读 28
算法

题目描述

有一个n*m的棋盘,在棋盘的每一个小方格中填入 1,2,3,4 这 4 个数字中的一个。请求出一共有多少种不同的棋盘,满足棋盘中每一个 2*2 的小棋盘中都有 1,2,3,4 这 4 个数字。由于这个结果可能会很大,你只需输出对 1e9+7 取模后的值。

输入格式

两个整数 n,m,表示棋盘的大小。

输出格式

一个整数表示答案的个数对 1e9+7取模后的值。

样例

in :2 3

out :48

分析

基础版

容易发现棋盘中任一个2*1的矩形A与相邻的2*1矩形B之间存在限制关系

注:这里,固定A与B相邻边是共同的长或共同的宽

体现在A中格子上的数字,均不等于B中格子上的数字

如:若A:1 2,则B:3 4或B:4 3

初始时,一种可能情况的A,确定两种可能情况的B

共有12种可能情况的A,1 2,1 3,1 4,2 3,2 4,3 4,2 1,3 1,4 1,3 2,4 2,4 3

往后,B成为了A,下一个B出现,出现两种情况

上述的运算,会分别在长为n的边与长为m的边上上演

二者重复的是类似于下图的情况

1 2 1 4

3 4 3 2

1 2 1 4

是4的阶乘,即24种可能

故,得到答案:12*(2^(n-1)+2^(m-1))-24

plus版

经上,A的12种可能中,上下颠倒相对的两种可能,与B的两种可能大同小异

可以认为是六种可能情况,乘上n与m次的2

即:6*(2^n+2^m)-24

也是基础版化简后的结果式

Code

#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
long long n,m,ans,total;
void st(int k) {
	long long t=2;
	ans=1;
	while(k) {
		if(k%2) ans*=t;
		t*=t,k>>=1,t%=mod,ans%=mod; }
	total+=ans;
	return; }
int main() {
	scanf("%lld%lld",&n,&m);
	m%=mod,n%=mod;
	st(n),st(m);
	total%=mod,total*=6,total-=24,total%=mod;
	printf("%lld",z);
	return 0; }

over

举报

相关推荐

0 条评论