社区讨论
一发非常猎奇的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 条回复,欢迎继续交流。
正在加载回复...