40分求助
查看原帖
40分求助
182229
songyuan888楼主2022/8/16 16:27

RT

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
long long a[1050][1050],b,n,m,ans[1050][1050],w[1050][1050],d[1050][1050];
void fun1()
{
	long long c[1050][1050];
	long long i,j,k;
	memset(c,0,sizeof(c));
	for(k=1;k<=2;k++)
		for(i=1;i<=2;i++)
			for(j=1;j<=2;j++)
				c[i][j]=(c[i][j]%m+ans[i][k]%m*a[k][j])%m;	
	for(i=1;i<=2;i++)
		for(j=1;j<=2;j++)
			ans[i][j]=c[i][j]%m;
}
void fun2()
{
	long long c[105][105];
	long long i,j,k;
	memset(c,0,sizeof(c));
	for(k=1;k<=2;k++)
		for(i=1;i<=2;i++)
			for(j=1;j<=2;j++)
				c[i][j]=(c[i][j]%m+a[i][k]%m*a[k][j])%m;
	for(i=1;i<=2;i++)
		for(j=1;j<=2;j++)
			a[i][j]=c[i][j]%m;
}
int main()
{
	long long i,j,k,p,q,a1,a2;
	cin>>p>>q>>a1>>a2>>n>>m;
	a[1][1]=p;
	a[1][2]=1;
	a[2][1]=q;
	a[2][2]=0;
	d[1][1]=a2;
	d[2][1]=a1;
	if(n==1)
	{
	    cout<<a1<<endl;
	    return 0;
	}
	if(n==2)
	{
	    cout<<a2<<endl;
	    return 0;
	}
//	m=1000000007;
	b=n-2;
	for(i=1;i<=2;i++)
		ans[i][i]=1;
	for(i=1;i<=2;i++)
		w[i][i]=0;
	while(b!=0)
	{
		if(b&1)
			fun1();
		fun2();
		b>>=1;
	}
/*	for(i=1;i<=2;i++)
	{
		for(j=1;j<=2;j++)
			cout<<ans[i][j]<<" ";
		cout<<endl;
	}*/
	for(i=1;i<=2;i++)
		for(j=1;j<=2;j++)
			for(k=1;k<=1;k++)
				w[i][k]=(w[i][k]%m+ans[i][j]%m*d[j][k]%m)%m;
	cout<<w[1][1]%m<<endl;
	return 0;
} 
2022/8/16 16:27
加载中...