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;
}