矩阵快速幂 10pts求调TVT
查看原帖
矩阵快速幂 10pts求调TVT
564732
TimSwn090306楼主2023/10/13 22:19

提交记录,求大佬帮助捏qwq

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxc=3;
const ll mod=7528443412579576937ll;
struct matrix{
    ll c[maxc][maxc];
    inline matrix() {memset(c,0,sizeof(c)); }
}s,t;
ll b,d,n;
inline ll mul(ll x,ll y){
    if (x<y) swap(x,y);
    ll res=0;
    while (y){
        if (y&1) res=(res+x)%mod;
        x=(x+x)%mod;
        y>>=1;
    }
    return res;
}
inline matrix mul(matrix x,matrix y){
    matrix res;
    for (int i=1;i<=2;i++){
        for (int j=1;j<=2;j++){
            for (int k=1;k<=2;k++){
                res.c[i][j]=res.c[i][j]+mul(x.c[i][k],y.c[k][j]);
                res.c[i][j]%=mod;
            }
        }
    }
    return res;
}
inline matrix poww(matrix x,ll y){
    matrix res=s;
    while (y){
        if (y&1) res=mul(res,x);
        x=mul(x,x);
        y>>=1;
    }
    return res;
}
int main(){
    scanf("%lld%lld%lld",&b,&d,&n);
    if (!n){
        printf("1\n");
        return 0;
    }
    s.c[1][1]=(b*b+d)/2,s.c[2][1]=b;
    t.c[1][1]=b,t.c[1][2]=1,t.c[2][1]=(d-b*b)/4;
    matrix ans=poww(t,n-2);
    // for (int i=1;i<=2;i++){
    //     for (int j=1;j<=2;j++) printf("%d ",ans.c[i][j]);
    //     printf("\n");
    // }
    printf("%lld\n",(ans.c[1][1]-(b*b!=d && !(n&1))%mod+mod)%mod);
    return 0;
}
2023/10/13 22:19
加载中...