3013. 填充棋盘

Description
横一划竖一划,横一划竖一划…………小R画出了一个n*m的棋盘。

由于NOIP快要到了,小R有了一个奇妙的想法。

在棋盘的每一个小方格中填入N,O,I,P这4个字母中的一个,若棋盘中每一个2*2的小棋盘中都有N,O,I,P这4个字母,小R就认为这个棋盘是幸运棋盘。小R想知道一共有多少种不同的幸运棋盘。由于这个结果可能会很大,你只需输出对1,000,000,007取模后的值。

Input
两个整数n,m表示棋盘的大小。

Output
一个整数表示幸运棋盘的个数对1,000,000,007取模后的值。

Sample Input
2 3

Sample Output
48

Data Constraint

Hint
对于30%的数据,n,m≤10

对于70%的数据,n,m≤1,000,000

对于100%的数据,2≤n,m≤2,000,000,000
数据这么大,而且只有两个数,一看就是找规律啦,ans=(2^n +2^m)*6-24

#include <iostream>
using namespace std;
const int mod=1000000007;
long long n,m,ans,z;
void ksm (int k)
{
	long long t=2;
	ans=1;
	while (k)
	{
	  if (k&1) ans*=t;
	  t*=t;
	  k>>=1;
	  t%=mod;
	  ans%=mod; 
	}
	z+=ans;
	return ;
}
bool p;
int main()
{
	cin>>n>>m;
	m%=mod;n%=mod;
     ksm (n);
     ksm (m);
	 z%=mod;
    z*=6;
    z-=24;
    z%=mod;
    cout<<z;
}	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值