萌新刚学OI,求救样例都没过的矩乘
查看原帖
萌新刚学OI,求救样例都没过的矩乘
247269
MSqwq楼主2021/3/1 21:59
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll mod;
ll n,m,k;
ll ans1[30][30],ans2[30][30],a[30][30],tmp[30][30];
ll x[30],y[30];
ll f1[30][30],f2[30][30];
void cheng(ll a[30][30],ll b[30][30])
{
	memset(tmp,0,sizeof(tmp));
	for(int i=1;i<=k;i++)
	for(int j=1;j<=k;j++)
	for(int q=1;q<=k;q++)
		tmp[i][j]=(tmp[i][j]+a[i][q]*b[q][j]%mod)%mod;
	
	memcpy(a,tmp,sizeof(tmp));
}

void cheng_(ll a[30][30],ll b[30][30],bool flag)
{
	memset(tmp,0,sizeof(tmp));
	for(int i=1;i<=k;i++)
	for(int j=1;j<=k;j++)
	for(int q=1;q<=k;q++)
		tmp[i][j]=(tmp[i][j]+a[i][q]*b[q][j]%mod)%mod;
	if(flag)memcpy(f1,tmp,sizeof(tmp));
	else memcpy(f2,tmp,sizeof(tmp));
}
void ksm1(ll b)
{
	for(int i=1;i<=k;i++)ans1[i][i]=1;
	while(b)
	{
		if(b&1)cheng(ans1,a);
		b>>=1;
		cheng(a,a);
	}
}

void ksm2(ll b)
{
	for(int i=1;i<=k;i++)ans2[i][i]=1;
	while(b)
	{
		if(b&1)cheng(ans2,a);
		b>>=1;
		cheng(a,a);
	}
}
int main()
{
	cin>>k;
	
	for(int i=1;i<=k;i++)cin>>x[i];
	for(int i=1;i<=k;i++)cin>>y[i];
	
	cin>>n>>m>>mod;
	k++;
	for(int i=2;i<=k-1;i++)a[i][i-1]=1;
	for(int i=1;i<=k-1;i++)a[i][k-1]=y[k-i];
	
	a[1][k]=1;
	a[k][k]=1;
	
	ksm1(n-1);
	ksm2(m);
	
	for(int i=1;i<=k-1;i++)
		f1[1][i]=f2[1][i]=x[i]%mod;
		
	cheng_(f1,ans1,1);
	cheng_(f2,ans2,0);
	cout<<(f2[1][k]-f1[1][k]+mod)%mod;
}
2021/3/1 21:59
加载中...