求助!!!
查看原帖
求助!!!
374769
Epi4any楼主2022/3/26 14:05

这个是矩阵乘法

#include<iostream>
#include<cstring>

#define N 3

#define MOD m

#define ll long long

using namespace std;

struct matrix{

    ll a[N][N];

    matrix(){memset(a,0,sizeof(a));}

}c,ans;

int n,m,tmp;

int t[20];

matrix operator *(const matrix &x,const matrix &y){

    matrix z;

    for(int i=0;i<N;i++) for(int j=0;j<N;j++) for(int k=0;k<N;k++){

        z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j])%MOD;

    }

    return z;

}

template <typename T>

T ksm(T a, long long b){

    T res=a; b--;

    while(b){

        if(b & 1) res=res *a;

        a=a*a;

        b>>=1;

    }

    return res;

}

int main(){

    int i;

    cin>>n>>m;

    ans.a[0][1] = ans.a[0][2] = c.a[1][0] = c.a[1][1] = c.a[2][1] = c.a[2][2] = 1;

    for (i = 1,t[0]=1; i <= 18; i++) t[i] = t[i - 1] * 10;

    for (i = 1;; i++) {

        c.a[0][0] = t[i] % m;

        tmp = min(n, t[i] - 1) - t[i - 1] + 1;

        ans = ans * ksm(c, tmp);

        if (t[i] - 1 >= n) break;

    }

    cout << ans.a[0][0] << endl;

    return 0;

}
2022/3/26 14:05
加载中...