MnZn刚学习矩阵求助
查看原帖
MnZn刚学习矩阵求助
537046
大眼仔Happy楼主2022/12/13 13:47

样例A了,但是交上去保龄。

我推的柿子是:

[an1n11]A[ann1]\begin{bmatrix}a_{n-1}\\n-1\\1\end{bmatrix}\xrightarrow{A}\begin{bmatrix}a_n\\n\\1\end{bmatrix}

A=[base×1011011001]A=\begin{bmatrix}base\times10&1&1\\0&1&1\\0&0&1\end{bmatrix}

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=7;
int L=3;
ll n,base=1,mod,ans;
struct Matrix
{
    ll M[N][N];
    void clear(){memset(M,0,sizeof(M));}
    void reset(){for(int i=1;i<=L;i++)M[i][i]=1;}
    Matrix(bool isT){clear();if(isT)reset();}
    Matrix friend operator *(const Matrix A,const Matrix B)
    {
        Matrix Ans(0);
        for(int i=1;i<=L;i++)
            for(int j=1;j<=L;j++)
                for(int k=1;k<=L;k++)
                    Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j])%mod;
        return Ans;
    }
    void print()
	{
    	for(int i=1;i<=L;i++)
    	{
    		for(int j=1;j<=L;j++)
    			printf("%lld ",M[i][j]);
    		printf("\n");
		}
	}
};
Matrix QuickPow(Matrix T,ll p)
{
    Matrix Ans(1);
    while(p)
    {
        if(p&1)Ans=Ans*T;
        T=T*T;p>>=1;
    }
    return Ans;
}
Matrix ANS(1),a(0);
void work(ll l,ll r)
{
	printf("%lld %lld\n",l,r);
	a.M[1][1]=(base*10)%mod;a.M[1][2]=a.M[1][3]=1;
	a.M[2][2]=1;a.M[2][3]=1;
	a.M[3][3]=1;
	a=QuickPow(a,r-l+1);
	ANS=ANS*a;
	a.print();
}
int main(){
	scanf("%lld%lld",&n,&mod);
	while(base<n)work(base,min(base*10-1,n)),base*=10;
	ans=ANS.M[1][3];
	if(base==n)ans=(ans*(base*10)+n)%mod;
	printf("%lld",ans);
	return 0;
}
2022/12/13 13:47
加载中...