题目描述
有一个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