链接:http://acm.hdu.edu.cn/showproblem.php?pid=6050
分析:最简单的做法就是一个个求。。先求出F1,n=[2^n-(-1)^n]/3,然后F2,n就是对上面的N项求和,结果是F2,n=[(2^N-1)*2^n+((-1)^N-1)/2*(-1)^n]/3,向下归纳证明,Fm,n=[(2^N-1)^(m-1)*2^n+(((-1)^N-1)/2)^(m-1)*(-1)^n]/3,直接快速幂搞一下就出来了。。
标答是利用矩阵。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int p=1e9+7; 6 typedef unsigned long long ll; 7 ll qpow(ll a,ll n){ 8 ll res=1,y=a,k=1; 9 while(k!=0&&k<=n){ 10 if(k&n){ 11 res=(res*y)%p; 12 } 13 y=(y*y)%p; 14 k<<=1; 15 } 16 return res; 17 } 18 int main(){ 19 //freopen("e:\in.txt","r",stdin); 20 int t; 21 ll n,m; 22 scanf("%d",&t); 23 while(t--){ 24 cin>>n>>m; 25 ll ans=0; 26 ll x; 27 x=qpow(2,n); 28 x=(x+p-1)%p; 29 ans=(qpow(x,m-1)*2)%p; 30 if(n%2==1){ 31 ans=(ans+1)%p; 32 } 33 ans=(ans*333333336)%p; 34 cout<<ans<<endl; 35 } 36 return 0; 37 }