这道题的最终结果其实不难,难点在于如何推出这个结果。
因为题目说每一个2*2的方格里的字母都不相同,所以可以得出N和M必定是大于等于2的。
字母不太好写,所以用1~4来代替。
2*2的方格中有24种不同的方案(具体可以自己去试一下)
我们假设把一个2*2的方格像右延长一格:
再把它先按照2*2填上数字(字母)
因为红色格子左边的两个格子填上了2和3,所以这两个格一定得填14或41
SO由于2*2的格子有24种,红框内又有两种可能,所以2*3的方案种数就是24*2=48种。
就是这样一个情况。同理,竖着也是一样。
那么怎么计算总和呢?
我们在填红蓝框的时候,有可能会出现一些重复和不成立的方案,而方案刚好是24种,所以只要减去24就可以了。
那么问题来了:问号处怎么算?
其实很简单就可以看出,问号所在的格子的其它周围的格子的值都是已知的,所以问号只能填1,其它也同理。
SO最后结果就是2^(n-2)+2^(m-2)-24(如果n和m中有一个为2就不用减)
然后,重点中的重点来了!
NM≤2,000,000,000(20亿)!!!
所以如果直接两个一重循环早就炸飞了。
这里讲一种快速求幂的方法:快速幂。
我们先假设有这样一个幂:a^11
因为11的二进制为1011,所以可以拆成
a^(8+2+1)
又可以变成
a^8*a^2*a^1
虽然这个式子看起来还是和之前的无半点区别,然而我们可以用这一条公式去把它简化:
a^b*a^b=a^2b
因为本题中的底数都是2,所以可以预先处理好所有的a^(2^b),之后用快速幂处理在取mod就行了。