//https://www.acwing.com/problem/content/description/3683/
3680. 爬楼梯游戏
include [HTML_REMOVED]
include [HTML_REMOVED]
long long n,mod=1e9+7;
void M1(long a[2],long b[2][2])
{
long c[2]={0};
for(int j=0;j<2;j)
{
for(int k=0;k<2;k)
{
c[j]=(c[j]+a[k]*b[k][j]%mod)%mod;//2维速降
}
}
memcpy(a,c,sizeof(c));//拷贝其他类型的数组,数据库命令
}
void M2(long b[2][2])
{
long c[2][2]={0};
for(int i=0;i<2;i)
{
for(int j=0;j<2;j)
{
for(int k=0;k<2;k)
{
c[i][j]=(c[i][j]+b[i][k]*b[k][j]%mod)%mod;
}
}
}
memcpy(b,c,sizeof(c));
}
int main()
{
while(~scanf(“%lld”,&n))
{ n;
if(n<0) break;//考虑完备,判断while循环的可行
else
{
long long a[2]={0,1};
long b[2][2]={0,1,1,1};
while(n)
{
if(n&1)
M1(a,b);
M2(b);
n>>=1;
}
printf(“%lld\n”,a[0]);
}
}
return 0;
}