JZOJ 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

 

分析

  • 显然,我们先以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 }

 

猜你喜欢

转载自www.cnblogs.com/zjzjzj/p/11134902.html
今日推荐