记录编号 |
328088 |
评测结果 |
AAAAAAAAAA |
题目名称 |
拆分游戏 |
最终得分 |
100 |
用户昵称 |
安呐一条小咸鱼。 |
是否通过 |
通过 |
代码语言 |
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);
}