蒟蒻求助!!!40pts WA了6个点 求大佬康康
查看原帖
蒟蒻求助!!!40pts WA了6个点 求大佬康康
400593
wuyiduo楼主2022/7/3 18:02
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct mrx{
	ll d[3][3];
}a,b;
ll n,m,f=0;
mrx qc(mrx x,mrx y){//矩阵乘法
	mrx ret;
	for(int i=0;i<3;i++) for(int j=0;j<3;j++) ret.d[i][j]=0;
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			for(int z=0;z<3;z++)
				ret.d[i][j]=(ret.d[i][j]+x.d[i][z]*y.d[z][j]%m)%m;
	return ret;
}
mrx qpow(mrx x,ll y){//矩阵快速幂
	mrx ret;
	for(int i=0;i<3;i++) for(int j=0;j<3;j++){
		if(i==j) ret.d[i][j]=1;
		else ret.d[i][j]=0;
	}
	while(y){
		if(y&1) ret=qc(x,ret);
		x=qc(x,x);
		y/=2;
	}
	return ret;
}
int main(){
	scanf("%lld%lld",&n,&m);
	int K=log10(n)+1;
	for(int k=1;k<=K;k++){
		for(int i=0;i<3;i++) for(int j=0;j<3;j++) a.d[i][j]=b.d[i][j]=0;
		a.d[0][0]=(ll)pow(10,k);
		a.d[0][1]=a.d[1][1]=a.d[1][2]=a.d[2][2]=1;
		b.d[0][0]=f;
		b.d[1][0]=(ll)pow(10,k-1);
		b.d[2][0]=1;
		/*for(int i=0;i<3;i++){
			for(int j=0;j<3;j++)
				cout<<a.d[i][j]<<" ";
			cout<<endl;
		}
		for(int i=0;i<3;i++){
			for(int j=0;j<3;j++)
				cout<<b.d[i][j]<<" ";
			cout<<endl;
		}*/
		if(k==K) b=qc(qpow(a,n-(ll)(pow(10,k-1))+1),b);
		else b=qc(qpow(a,9*(ll)(pow(10,k-1))),b);
		f=b.d[0][0]%m;
	}
	printf("%lld",f);
	return 0;
}
2022/7/3 18:02
加载中...