思路:
构造矩阵,1 3 Sn
0 3 An
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include <queue>
using namespace std;
int n;
const int mod=1000000007;
struct node
{
long long c[4][4];
}arr_base,arr_ans,arr_res;
node mult(node a,node b)
{
node temp;
memset(temp.c,0,sizeof(temp.c));
for(int i=1;i<=2;i++)
{
for(int j=1;j<=2;j++)
{
for(int k=1;k<=2;k++)
{
temp.c[i][j]=(temp.c[i][j]+a.c[i][k]*b.c[k][j] )%mod;
}
}
}
return temp;
}
void quick()
{
for(int i=1;i<=2;i++)
{
arr_res.c[i][i]=1;
}
while(n)
{
if(n&1)
{
arr_res=mult( arr_base,arr_res );
}
arr_base=mult(arr_base,arr_base);
n=n/2;
}
}
int main()
{
cin>>n;
arr_base.c[1][1]=1;
arr_base.c[1][2]=3;
arr_base.c[2][1]=0;
arr_base.c[2][2]=3;
arr_ans.c[1][1]=1;
arr_ans.c[2][1]=1;
if(n==0)
cout<<1<<endl;
else
{
quick();
arr_ans=mult(arr_res,arr_ans);
cout<<arr_ans.c[1][1]%mod<<endl;
}
return 0;
}