wa了一个点(第二个),t了一个点(第十个)
#include <bits/stdc++.h>
using namespace std;
const int mod=1000000007;
long long n,op[3],a[3],arr[3][3],ans[3][3],z[3][3];
void sum_1(){
memset(z,0,sizeof(z));
for(int i=1; i<=2; i++){
for(int j=1; j<=2; j++){
for(int k=1; k<=2; k++){
z[i][j]=(z[i][j]+(ans[i][k]*arr[k][j])%mod)%mod;
}
}
}
for(int i=1; i<=2; i++){
for(int j=1; j<=2; j++){
ans[i][j]=z[i][j];
}
}
}
void sum_2(){
memset(z,0,sizeof(z));
for(int i=1; i<=2; i++){
for(int j=1; j<=2; j++){
for(int k=1; k<=2; k++){
z[i][j]=(z[i][j]+(arr[i][k]*arr[k][j])%mod)%mod;
}
}
}
for(int i=1; i<=2; i++){
for(int j=1; j<=2; j++){
arr[i][j]=z[i][j];
}
}
}
int ksm(int n){
while(n>0){
if(n&1){
sum_1();
}
n>>=1;
sum_2();
}
}
int main(){
cin>>n;
if(n==0){
cout<<0;
return 0;
}
if(n==2 || n==1){
cout<<1;
return 0;
}
a[1]=a[2]=1;
for(int i=1; i<=2; i++){
ans[i][i]=1;
}
for(int i=1; i<=2; i++){
for(int j=1; j<=2; j++){
arr[i][j]=1;
}
}
arr[1][1]=0;
n-=2;
ksm(n);
for(int i=1; i<=2; i++){
for(int j=1; j<=2; j++){
op[i]=(op[i]+(ans[i][j]*a[j])%mod)%mod;
}
}
cout<<op[2];
return 0;
}