hdu 2068
#include<bits/stdc++.h>
using namespace std;
//用线段树维护一个2*2的矩阵,a[i][j]表示从这一层第i个门到下一层第j个门是否联通,
//第i层到第j层之间的矩阵相乘之后的结果矩阵,各元素和为从第i层到第j层的种类数
const int mod=1000000007;
struct mat{
long long a[2][2];
}tr[400005];
mat mul(mat x,mat y)
{
mat ne;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
ne.a[i][j]=0;
for(int k=0;k<2;k++)
{
ne.a[i][j]=(ne.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
}
}
}
return ne;
}
void build(int i,int l,int r)
{
if(l==r)
{
for(int ii=0;ii<2;ii++)
{
for(int j=0;j<2;j++)
tr[i].a[ii][j]=1;
}
return ;
}
int mid=l+r>>1;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tr[i]=mul(tr[i*2],tr[i*2+1]