求卡常
查看原帖
求卡常
1013955
1234567890sjx楼主2024/9/30 13:51

rt,不知道是时间复杂度假了还是常数大了

#include<bits/stdc++.h>
#define int long long
using namespace std;
char *p1,*p2,buf[1000100];
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000096,stdin),p1==p2)?EOF:*p1++)
int read(){
    int x=0;char c=gc();
    while(c<48)c=gc();
    while(c>47)x=(x<<3)+(x<<1)+(c&15),c=gc();
    return x;
}
const int N=500100;
int mod;
struct M{
    int n,m,z[3][3];
    M() {n=m=0;memset(z,0,sizeof z);}
} ;
M operator*(const M&l,const M&r){
    M res;
    res.n=l.n,res.m=r.m;
    for(int k=1;k<3;++k)
    for(int i=1;i<3;++i)
    for(int j=1;j<3;++j)
    res.z[i][j]=(res.z[i][j]+l.z[i][k]*r.z[k][j]%mod)%mod;
    return res;
}
M ksm(M a,int b){
    M E;E.n=E.m=2;
    E.z[1][1]=E.z[2][2]=1;
    while(b){
        if(b&1)E=E*a;
        a=a*a,b>>=1;
    }
    return E;
}
int fibo(int x){
    if(!x)return 0;if(x<=2)return 1;
    M st,bas;st.n=st.m=bas.m=2;bas.n=1;
    st.z[1][1]=st.z[1][2]=st.z[2][1]=bas.z[1][1]=bas.z[1][2]=1;
    return (bas*ksm(st,x-1)).z[1][2];
}
signed main(){
    int T=read();
    while(T--){
        int n=read();mod=read();
        int f1=fibo(n),f2=fibo(n+1);
        printf("%lld\n",f1*f2%mod*(1+f1)%mod);
    }
    return 0;
}

2024/9/30 13:51
加载中...