萌新刚学矩乘60pts求助qwq
查看原帖
萌新刚学矩乘60pts求助qwq
385748
渡鸦2007楼主2022/8/3 11:15
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define re register
#define int unsigned long long
快读略
int n,m;
struct matrix
{
	int r,c;int ma[10][10];
	matrix operator *(matrix o)
	{
		matrix ret;ret.r =r;ret.c =o.c ;
		for (int i=1;i<=r;++i)
		{
			for (int j=1;j<=o.c ;++j)
			{
				ret.ma [i][j]=0;
				for (int k=1;k<=c;++k)
				{
					ret.ma [i][j]+=ma[i][k]%m*o.ma [k][j]%m;
					ret.ma [i][j]%=m;
				}
			}
		}
		return ret;
	}
	matrix()
	{
		r=0;c=0;memset(ma,0,sizeof ma);
	}
}beg,ch;
matrix operator ^(matrix &m,int up)
{	
	matrix t;
	if (up==1) return m;
	int tmp=up&1;up>>=1;
	t=m^up;
	t=t*t;
	if (tmp)
	{
		t=t*m;
	}
	return t;
}
int po[30];
int log10(int a)
{
	for (int i=1;i<=18;++i)
	{
		if (po[i]>a)
		{
			return i-1;
		}
	}
}
signed main()
{
	n=read();m=read();po[0]=1;
	for (int i=1;i<=18;++i) po[i]=10*po[i-1];
	beg.r =1;beg.c =3;
	beg.ma [1][1]=0;beg.ma [1][2]=0;beg.ma [1][3]=1;
	for (int i=1;i<=log10(n);++i)
	{
		ch.r =3;ch.c =3;
		ch.ma [1][1]=po[i];ch.ma [1][2]=0;ch.ma [1][3]=0;
		ch.ma [2][1]=1;ch.ma [2][2]=1;ch.ma [2][3]=0;
		ch.ma [3][1]=1;ch.ma [3][2]=1;ch.ma [3][3]=1;
		ch=(ch^(po[i]-po[i-1]));
		beg=beg*ch;
		beg.ma [1][2]=po[i]-1;beg.ma [1][3]=1;
	}
	beg.ma [1][1]%=m;beg.ma [1][2]%=m;beg.ma [1][3]%=m;
	int i=log10(n)+1;
	if (n==po[i-1]-1)
	{
		cout<<beg.ma [1][1]%m;
		return 0;
	}
	ch.r =3;ch.c =3;
	ch.ma [1][1]=po[i]%m;ch.ma [1][2]=0;ch.ma [1][3]=0;
	ch.ma [2][1]=1;ch.ma [2][2]=1;ch.ma [2][3]=0;
	ch.ma [3][1]=1;ch.ma [3][2]=1;ch.ma [3][3]=1;
	ch=(ch^(n-po[i-1]+1));
	beg=beg*ch;
	cout<<beg.ma [1][1]%m;
	fclose(stdin);
	fclose(stdout);
	return 0;
}


2022/8/3 11:15
加载中...