60pts why
查看原帖
60pts why
1054119
xzq4121楼主2024/8/17 15:50

矩阵:

[a101]\begin{bmatrix} a & 1 \\ 0 & 1 \\ \end{bmatrix}

和

[X0c]\begin{bmatrix} X_0 \\ c \\ \end{bmatrix}

code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll m,a,c,x,n,g;
struct puck{
    ll duck[3][3];
    void clear(){
        memset(duck,0,sizeof(duck));
    }
};
void chen(puck &aa,puck bb){
    puck ccf;
    for(int i=1;i<=2;i++){
        for(int j=1;j<=2;j++){
            ccf.duck[i][j]=aa.duck[i][j];
        }
    }
    memset(aa.duck,0,sizeof(aa.duck));
    for(int i=1;i<=2;i++){
        for(int j=1;j<=2;j++){
            for(int k=1;k<=2;k++){
                aa.duck[i][j]=(ll)(__int128(aa.duck[i][j]%m+__int128(ccf.duck[i][k]%m*bb.duck[k][j]%m)%m)%m);
            }
        }
    }
}
puck ju,ans;
void mi(ll y){
    while(y){
        if(y&1) chen(ans,ju);
        chen(ju,ju);
        y>>=1;
    }
}
int main(){
    scanf("%lld %lld %lld %lld %lld %lld",&m,&a,&c,&x,&n,&g);
    a%=m;
    x%=m;
    c%=m;
    ans.duck[1][1]=ans.duck[2][2]=1;
    ju.duck[1][1]=a;
    ju.duck[1][2]=1;
    ju.duck[2][1]=0;
    ju.duck[2][2]=1;
    mi(n);
    printf("%lld\n",(ll)(__int128(ans.duck[1][1]*x%m+ans.duck[1][2]*c%m)%m)%g);
    return 0;
}
2024/8/17 15:50
加载中...