高中OJ3013. 【NOIP2012模拟10.6】填充棋盘

这道题的最终结果其实不难,难点在于如何推出这个结果。


因为题目说每一个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就行了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值