20pts求调,悬5关
查看原帖
20pts求调,悬5关
658497
letianJOE楼主2025/7/28 15:10
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct matrix
{
	int jz[20][20];
};
matrix ans,base;
int k;
int c[25];
int m,n,p;
int ans1,ans2;
matrix operator *(matrix x,matrix y)
{
	matrix c;
	for(int i=1;i<=15;i++)
	    for(int j=1;j<=15;j++)
	    {
	    	int sum=0;
	    	for(int k=1;k<=15;k++)
	    		sum=(sum+((x.jz[i][k]*y.jz[k][j])%p))%p;
	    	c.jz[i][j]=sum;
		}
	return c;
}
void make_base()
{
//	for(int i=1;i<k;i++) //列 
//	    for(int j=1;j<=k+1;j++) //行 
//	    {
//	    	base.jz[j][i]=0;
//	    	if(j==i+1)
//	    	    base.jz[j][i]=1;
//		}
//	base.jz[1][k]=0;
//	for(int i=1;i<=k;i++)
//	    base.jz[i+1][k]=c[i]; 
//	base.jz[k][k+1]=base.jz[k+1][k+1]=1;
	//
	for(int i=1;i<=k-1;i++)
	    for(int j=1;j<=k;j++)
	    {
	    	base.jz[j][i]=0;
	    	if(j==i+1)
	    	    base.jz[j][i]=1;
		}
	for(int i=1;i<=k;i++)
		base.jz[i][k]=c[k+1-i];
	base.jz[k+1][k]=0;
	for(int i=1;i<=k+1;i++)
	    base.jz[i][k+1]=0;
	base.jz[k+1][k+1]=1;
    base.jz[2][k+1]=1;
}
signed main()
{
	cin>>k;
	for(int i=1;i<=k;i++)
	    cin>>ans.jz[1][i];
	for(int i=1;i<=k;i++)
		cin>>c[i];
	ans.jz[1][k+1]=ans.jz[1][1];
	cin>>m>>n>>p;
	make_base(); 
//	//
//	cout<<"startjz:"<<"\n";
//	for(int i=1;i<=k+1;i++)
//	{
//		for(int j=1;j<=k+1;j++)
//	        cout<<base.jz[i][j]<<" ";
//		cout<<"\n";
//	}
//	puts("");
//	ans=ans*base;
//	cout<<"ans:\n";
//	for(int i=1;i<=k+1;i++)
//	    cout<<ans.jz[1][i]<<" ";
//	cout<<"\n\n";
    //
    int power=m-2;
    while(power>0)
	{
//		cout<<"进来了\n";
	   	if(power&1)
            ans=ans*base;
    	power>>=1;
        base=base*base;
	}
	ans1=ans.jz[1][k+1];
//		cout<<"原来的ans:"<<"\n"; 
//	for(int i=1;i<=k+1;i++)
//	    cout<<ans.jz[1][i]<<" ";
//	cout<<"\n\n";
	//
	//第二次 
	//
	
	power=n-m+1;
//	cout<<"power:"<<power<<"\n";
	make_base();
	//
//	ans=ans*base;
//	cout<<"ans:\n";
//	for(int i=1;i<=k+1;i++)
//	    cout<<ans.jz[1][i]<<" ";
//	cout<<"\n\n";
	//
//    for(int i=1;i<=k+1;i++)
//    {
//    	for(int j=1;j<=k+1;j++)
//    	    cout<<base.jz[i][j];
//    	cout<<"\n";
//	}
//    ans=ans*base;
//    for(int i=1;i<=k+1;i++)
//        cout<<ans.jz[1][i]<<" ";
//    cout<<"\n\n";
    while(power>0)
    {
    	if(power&1)
    	    ans=ans*base;
//    	cout<<ans.jz[1][k+1]<<"\n";
    	power>>=1;
    	base=base*base;
	}
	ans2=ans.jz[1][k+1];
//	power=n-1;
//	while(power>0){
//	   	if(power&1)
//               ans=ans*base;
//           power>>=1;
//           base=base*base;
//    }
//	int anss=ans.jz[1][1];
	
//	cout<<ans1<<" "<<ans2<<" "<<"\n";
//    cout<<ans.jz[1][1]<<"\n";
	cout<<ans2-ans1;
	return 0;
}
/*
2
1 1
1 2
2 10 1000003
*/
2025/7/28 15:10
加载中...