记录编号 328088 评测结果 AAAAAAAAAA
题目名称 拆分游戏 最终得分 100
用户昵称 Gravatar安呐一条小咸鱼。 是否通过 通过
代码语言 C++ 运行时间 0.007 s
提交时间 2016-10-23 18:44:09 内存使用 0.31 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long LL;
const int M = 1e9+7 ;
LL n;
LL mul(LL x,LL y,LL z){return (x*y-(LL)(x/(long double)z*y+1e-3)*z+z)%z;}
struct matrix{
	LL n,m,a[50][50];
	void clear(){
		n=0,m=0;
		memset(a,0,sizeof(a));
	}
	matrix operator *(const matrix& x){
		if(m!=x.n)abort();
		matrix tmp;
		tmp.clear();tmp.n=n;tmp.m=x.m;
		for(LL i=1;i<=tmp.n;i++){
			for(LL j=1;j<=tmp.m;j++){
				for(LL k=1;k<=m;k++){
					tmp.a[i][j]+=mul(x.a[k][j],a[i][k],M); 
					tmp.a[i][j]%=M;
				}
			}
		}
		return tmp;
	}
};//723191374 574231893 127 0 612937 18293401

int main()
{
	freopen("resolution.in","r",stdin); 
	freopen("resolution.out","w",stdout);
	scanf("%lld",&n);
	n--;
	matrix first;
	first.n=1;
	first.m=2;
	first.a[1][1]=1;
	first.a[1][2]=1;
	matrix x;
	x.clear();
	x.n=2;
	x.m=2;
	x.a[1][1]=1;  x.a[1][2]=1;  
	x.a[2][1]=2;  x.a[2][2]=1;  
	for(LL i=1;i<=n;i<<=1,x=x*x){
		if(n&i)first=first*x;
	}
	LL ans=first.a[1][1]%M;
	if(n%2==1){ printf("%lld",mul(ans,ans,M));}
	else printf("%lld",(mul(ans,ans,M)+1)%M);
}