题目
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
分析
- 显然,我们先以2*2为起点每向下就*2,向左*2
- 所为这样下来就会出现限定数,所以不用管
- 然后就去开始重复的24
代码
1 #include<iostream> 2 #define mod 1000000007 3 using namespace std; 4 long long ksm(long long a,long long b) 5 { 6 long long x=a,ans=1; 7 while (b) 8 { 9 if (b&1!=0) ans=ans*x%mod; 10 x=x*x%mod; 11 b>>=1; 12 } 13 return ans%mod; 14 } 15 int main () 16 { 17 long long n,m; 18 cin>>n>>m; 19 long long a=ksm(2,n-1),b=ksm(2,m-1); 20 cout<<(a+b-2)*12%mod; 21 }