欢迎访问 My Luogu Space。
【题目大意】
有一个 n ∗ m n*m n∗m 的棋盘,每个格子里面都有 “N O I P” 四个字母当中的一个。
如果这个棋盘内每一个 2 ∗ 2 2*2 2∗2 的田字格里都有这四个字母,那么我们称之为 “幸运棋盘”。
现在请求出有多少个不同的幸运棋盘(不考虑翻转)。
【题解】
对于最左上角的一个田字格,一共有
4
∗
3
∗
2
∗
1
=
24
4*3*2*1=24
4∗3∗2∗1=24 种填法。
如图是一种填法:
接下来我们考虑每一列能怎样进行变化。
从第三列开始,每一列都能向下(向上等效)移动一格:
因此只考虑列,有
2
m
−
2
2^{m-2}
2m−2 种填法。
而对于每一行,同理也有 2 n − 2 2^{n-2} 2n−2 种填法。
显然,这样的移动方法可以考虑到所有的情况。
我们发现,如果有一列进行了变动,那么其他的列不受影响,而所有的行都不能进行变动,而每一行进行变动也同理,符合加法计数原理。并且这样的计算方式会计算原本的填法两次,因此要减一。
最终 a n s = 24 ∗ ( 2 n − 2 + 2 m − 2 − 1 ) ans=24*(2^{n-2}+2^{m-2}-1) ans=24∗(2n−2+2m−2−1)
【代码】
// output format !!!
// long long !!!
#include <bits/stdc++.h>
typedef long long LL;
using namespace std;
const int MOD = 1e9+7;
int n, m;
LL fpow(LL a, int k){
LL c=1;
while(k){
if(k&1) c = c*a%MOD;
a = a*a%MOD, k >>= 1;
}
return c;
}
int main(){
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
scanf("%d%d", &n, &m);
printf("%lld", 24*(fpow(2, m-2)+fpow(2, n-2)-1)%MOD);
return 0;
}