acwing(矩阵乘法+快速幂) 1303. 斐波那契前 n 项和(蓝桥杯)

题目:1303. 斐波那契前 n 项和

acwing(矩阵乘法+快速幂) 1303. 斐波那契前 n 项和(蓝桥杯)_第1张图片
大佬思路

#include

using namespace std;
typedef long long LL;
typedef pair<double,double>PII;
const int N=1e5+10;
const int mod=1000000009;
LL n,m;
LL s[3][3]={
{2,0,-1},{1,0,0},{0,1,0}
};

void mult1(LL x[3],LL y[][3]){
    LL t[3]={0};
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            t[i]=(t[i]+y[i][j]*x[j])%m;
        }
    }
    memcpy(x,t,sizeof t);
}
void mult2(LL x[][3],LL y[][3]){
    LL t[3][3]={0};
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            for(int k=0;k<3;k++){
                t[i][j]=(t[i][j]+x[i][k]*y[k][j])%m;
            }
        }
    }
    memcpy(x,t,sizeof t);
}

int main(){
    cin>>n>>m;
    LL x[3]={2,1,0};
    while(n){
       if(n&1) mult1(x,s);
       mult2(s,s);
       n>>=1;
    }
    printf("%lld",(x[2]%m+m)%m);
    return 0;
}

你可能感兴趣的:(AcWing,蓝桥杯,蓝桥杯,c++,算法,矩阵乘法,快速幂)