40pts求助矩阵加速

P1349 广义斐波那契数列

我的情况好像和你的一样,也是刚开始20pts,a1和a2换一下就40pts了,过的点和你的都一样
by lkxsg123 @ 2023-07-26 21:29:20


我的最后sum[1][2]改成sum[2][1]就过了
by lkxsg123 @ 2023-07-26 21:31:02


```cpp #include<bits/stdc++.h> using namespace std; long long n,k1[3][3]={0,0,0,0,1,1,0,1,0},sum[3][3]={0,0,0,0,1,0,0,0,1},m,p,q,a11,a22,MOD; int cf(){ long long nm[3][3]; for(int i=1;i<=2;i++){ for(int j=1;j<=2;j++){ nm[i][j]=0; for(int k=1;k<=2;k++){ nm[i][j]=(nm[i][j]+sum[i][k]*k1[k][j]%MOD)%MOD; } } } for(int i=1;i<=2;i++){ for(int j=1;j<=2;j++){ sum[i][j]=nm[i][j]; } }return 0; } int cf2(){ long long nm[3][3]; for(int i=1;i<=2;i++){ for(int j=1;j<=2;j++){ nm[i][j]=0; for(int k=1;k<=2;k++){ nm[i][j]=(nm[i][j]+k1[i][k]*k1[k][j]%MOD)%MOD; } } } for(int i=1;i<=2;i++){ for(int j=1;j<=2;j++){ k1[i][j]=nm[i][j]; } }return 0; } int main(){ cin>>p>>q>>a11>>a22>>n>>MOD; k1[1][1]=p; k1[2][1]=q; if(n>2){ n-=2; while(n){ if(n&1)cf(); cf2(); n>>=1; } cout<<(a22*sum[1][1]+a11*sum[2][1])%MOD; } else if(n==1)cout<<a11;else cout<<a22;; } ```
by lkxsg123 @ 2023-07-26 21:31:39


@[lkxsg123](/user/944410) 输出那里
by lkxsg123 @ 2023-07-26 21:32:23


@[Maysoul](/user/409774) 你推错式子了,你的`ans` 矩阵是 $1\times 2$ 的,那么你的 `date`矩阵应该是 $\begin{bmatrix} p &1 \\ q&0 \end{bmatrix}$,而不是 $\begin{bmatrix} p &q \\ 1&0 \end{bmatrix}$,你可以演算一下。 改了就过了。
by bzzltl @ 2023-08-16 10:32:19


|