比赛 |
noip普及组模拟赛 |
评测结果 |
AAAAAAAAAA |
题目名称 |
AABB(无题面) |
最终得分 |
100 |
用户昵称 |
梦那边的美好ET |
运行时间 |
0.002 s |
代码语言 |
C++ |
内存使用 |
0.31 MiB |
提交时间 |
2018-10-27 21:02:26 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const long long mod=1000000007;
long long ans[4][4],n,f[4][4],a[4][4];
int main(){
freopen("AABB.in","r",stdin);
freopen("AABB.out","w",stdout);
scanf("%lld",&n);
if(n<=1){printf("1");return 0;}
ans[1][1]=ans[2][2]=ans[3][3]=a[1][2]=a[2][2]=a[3][2]=a[3][3]=1;
a[2][3]=2;
while(n){
if(n&1){
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
f[i][j]+=a[i][k]*ans[k][j];
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
ans[i][j]=f[i][j]%mod,f[i][j]=0;
}
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
f[i][j]+=a[i][k]*a[k][j];
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
a[i][j]=f[i][j]%mod,f[i][j]=0;
n>>=1;
}
printf("%lld",(ans[2][1]+ans[2][2]+ans[2][3])%mod);
return 0;
}
/**********************************
递推公式:
f[0]=1;
f[1]=1;
f[i]=sum[0,i-2]*2+f[i-1];
求:f[n+1]
乘n次
| f[0] | |0 1 0| | f[1] |
| f[1] |* |0 1 2| =| f[2] |
|sum[0,0]| |0 1 1| |sum[0,1]|
**********************************/