社区讨论

一发非常猎奇的AC求大佬解答

P1962斐波那契数列参与者 5已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mjsesxkk
此快照首次捕获于
2025/12/30 17:53
2 个月前
此快照最后确认于
2026/01/02 14:45
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3,mod=1e9+7;
ll n;
struct matrix{
    int a[N][N];
    matrix(){
        for(int i=1;i<N;i++)
            for(int j=1;j<N;j++)
                a[i][j]=0;
    }
    void init(){
        for(int i=1;i<N;i++)
            for(int j=1;j<N;j++)
                a[i][j]=1;
    }
};
matrix operator*(const matrix& a,const matrix& b){
    matrix c;
    for(int i=1;i<N;i++)
        for(int j=1;j<N;j++)
            for(int k=1;k<N;k++)
                c.a[i][j]=(1ll*a.a[i][k]*b.a[k][j]%mod+c.a[i][j])%mod;
    return c;
}
matrix qpow(matrix d,ll z){
    matrix ret;
    ret.init();
    while(z){
        if(z&1)ret=ret*d;
        z>>=1;
        d=d*d;
    }
    return ret;
}
matrix a;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n;
    if(n==1){
        cout<<1<<endl;
        return 0;
    }
    a.a[1][1]=1;a.a[1][2]=1;
    a.a[2][1]=1;a.a[2][2]=0;
    a=qpow(a,n-2);
    cout<<a.a[1][1]<<endl;
    return 0;
}
如上代码所示,可以发现我的qpow中的ret不小心初始化成了全1矩阵而非单位矩阵,而且最后的使用快速幂时的次数本来应该是n-1我写成了n-2,这俩个错误一起出现我反而AC了???(不一起出现好像是AC不了的)
后面改对了也是AC,但是感觉有的奇怪,求大佬解答这样为什么能AC

回复

5 条回复,欢迎继续交流。

正在加载回复...