比赛 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]|
**********************************/