传送门
A - Abstract Painting
题意
本题主要是定义一种格式,1X1正方体的四条边有两个不同颜色组成,每个颜色两条边,问nXm的矩形有多少种情况(共有三种颜色)。、
推理一下规律,对于1X1的小正方形,共有四条边,选择两种颜色是C(2,3),放到对应位置是有三种情况,上左,上右,上下 颜色相同,是三种排法,然后选出的两种颜色各有两种排法,最后答案是3X3X2=18;
那么对于1x2的小正方形,在一格小正方形已经确定了18种情况的基础上,只需要确定剩下的那个小正方形有多少情况,相乘即可,则,因为一条边相邻,则对于第二个正方形来说,有一条边已知,则剩下的三条边有多少种情况呢?先看颜色,还有两种选择,同色边的选择有三种方案,即六种情况,则乘上6即可,那么对于1x3的小格子,对于前两个确认的情况下,再乘6即可。
那么怎么推理2X2的情况呢,我们发现先推理完三个相连的以后是18x6x6
对于第四个,他的两条边都已经被限制了,那么,对于两条边被限制的情况,分两种情况,一种是两条边颜色相同,那剩下两条边是颜色相同,颜色有2 种情况,则为1x2;第二种情况是两条被限制的边颜色不同,那么便不可以再自己选颜色了,那么对位置有两种情况,也是1x2 那么无论什么情况都是2种,那么2x2 的表格是18x6x6x2,对于任何一个图像,都可以用这种推理方式退出答案。
代码实现就很简单了,如下;
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int arr[30][3000];
void solve(){
int n,a,b;
ll ans=0;
cin>>n;
while(n--){
cin>>a>>b;
memset(arr,0,sizeof(arr));
ans=1;
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
if(i==1&&j==1)ans*=18;
else if(i==1||j==1)ans*=6;
else ans*=2;
ans%=1000000000+7;
}
}
cout<<ans<<endl;
}
}
int main()
{
solve();
return 0;
}