码风清丽,求调错
查看原帖
码风清丽,求调错
282624
Alexia_Cosecant楼主2022/7/16 17:03
#include<bits/stdc++.h>
using namespace std;
long long m,n;
long long ans[5][5],A[5][5],t[5][5];
long long z[20];
void qsm(long long x)
{
	while(x)
	{
		if(x%2==1)
		{
			memset(t,0,sizeof(t));
			for(int i=1;i<=3;i++)
				for(int j=1;j<=3;j++)
					for(int k=1;k<=3;k++)
						t[i][j]=(t[i][j]+A[i][k]*ans[k][j]%m)%m;
			memcpy(ans,t,sizeof(ans));
		}
		memset(t,0,sizeof(t));
		for(int i=1;i<=3;i++)
			for(int j=1;j<=3;j++)
				for(int k=1;k<=3;k++)
					t[i][j]=(t[i][j]+A[i][k]*A[k][j]%m)%m;
		memcpy(A,t,sizeof(A));
		x/=2;
	}
}
int main()
{
	scanf("%lld%lld",&n,&m);
	z[0]=1;
	for(int i=1;i<=18;i++) z[i]=z[i-1]*10;
	A[1][2] = A[1][3] = A[2][2] = A[2][3] = A[3][3] = 1;
	ans[1][1] = ans[2][1] = ans[3][1] = 1;
	for(int i=0;i<=17;i++)
	{
		if(n>=z[i]&&n<=z[i+1])
		{
			A[1][1] = z[i+1];
			if(i==0) qsm(n-1); 
			else qsm(n-z[i]+1); 
			break;
		}
		else
		{
			A[1][1] = z[i+1];
			if(i==0) qsm(8);
			else qsm(z[i+1]-z[i]);
		}
	}
	printf("%lld",ans[1][1]);
	return 0;
}
2022/7/16 17:03
加载中...