MLE on #1 #2
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=210,P=1e9+7;
int n;
struct mat
{
int p[3][3];
mat() {memset(p,0,sizeof(p));}
}A;
inline mat pluss(mat a,mat b)
{
mat c;
for(unsigned short i=1;i<=2;++i)
for(unsigned short j=1;j<=2;++j)
for(unsigned short k=1;k<=2;++k)
c.p[i][j]+=a.p[i][k]*b.p[k][j],c.p[i][j]%=P;
return c;
}
inline mat expluss(mat a,mat b,register int n,register int m,register int p)
{
mat c;
for(register short i=1;i<=n;++i)
for(register short j=1;j<=p;++j)
for(register short k=1;k<=m;++k)
c.p[i][j]+=a.p[i][k]*b.p[k][j],c.p[i][j]%=P;
return c;
}
inline mat qpow(register int n)
{
if(n==1) return A;
mat t=qpow(n/2);
if(n%2==1) return pluss(pluss(t,t),A);
else return pluss(t,t);
}
signed main()
{
A.p[1][1]=1;A.p[1][2]=1;
A.p[2][1]=1;A.p[2][2]=0;
cin>>n;
mat c=qpow(n-2),h;
h.p[1][1]=1;h.p[2][1]=1;
c=expluss(c,h,2,2,1);
cout<<c.p[1][1]%P;
}
帮忙卡卡空间()