萌新刚学OI 0.1秒,MLE求调❥
查看原帖
萌新刚学OI 0.1秒,MLE求调❥
992743
HS_xh楼主2024/1/7 16:33

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;
}

帮忙卡卡空间()

2024/1/7 16:33
加载中...