思路;
矩阵快速幂;
sn-1 3 1 sn
* =
1 0 1 1
来,上代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define mod 1000000007 struct NodeType { long long a[3][3]; }; struct NodeType ans; long long n; struct NodeType mul(NodeType pos) { NodeType res; res.a[1][1]=0,res.a[1][2]=0; res.a[2][1]=0,res.a[2][2]=0; for(int i=1;i<=2;i++) { for(int j=1;j<=2;j++) { for(int v=1;v<=2;v++) { res.a[i][j]=(res.a[i][j]+(pos.a[i][v]*pos.a[v][j])%mod)%mod; } } } return res; } void poww(int mi) { NodeType pos; pos.a[1][1]=3,pos.a[1][2]=1; pos.a[2][1]=0,pos.a[2][2]=1; while(mi>0) { struct NodeType res; res.a[1][1]=0,res.a[1][2]=0; res.a[2][1]=0,res.a[2][2]=0; if(mi&1) { for(int i=1;i<=2;i++) { for(int j=1;j<=2;j++) { for(int v=1;v<=2;v++) { res.a[i][j]=(res.a[i][j]+(ans.a[i][v]*pos.a[v][j])%mod)%mod; } } } ans=res; } pos=mul(pos),mi=mi>>1; } } int main() { scanf("%lld",&n);n--; ans.a[1][1]=3,ans.a[1][2]=1; ans.a[2][1]=0,ans.a[2][2]=1; poww(n); cout<<(ans.a[1][1]+ans.a[1][2])%mod; return 0; }