矩快RE0求助
查看原帖
矩快RE0求助
418739
gongziwen楼主2024/1/14 12:28

样例过了

#include<bits/stdc++.h>
const int N=18;
long long m,k,n,a[N][N],g[N][N],ans[N][N],f[N][N],b[N],c[N],Q;
long long matrix_pow(long long m)
{
	memset(a,0,sizeof(a)*4);
	for(int i=2;i<=k+1;i++) ans[1][i]=b[i-1],ans[1][1]+=b[i-1],a[i][1]=a[i][2]=c[i-1],a[i][i+1]=i<=k?1:0;
	a[1][1]=1;
//	for(int i=1;i<=k+1;i++)
//		for(int j=1;j<=k+1;j++) printf("%d%c",a[i][j]," \n"[j==k+1]);
//	for(int i=1;i<=k+1;i++) printf("%d%c",ans[1][i]," \n"[i==k+1]);
	m-=k;
	while(m)
	{
//	for(int i=1;i<=k+1;i++)
//		for(int j=1;j<=k+1;j++) printf("%d%c",a[i][j]," \n"[j==k+1]);
//	for(int i=1;i<=k+1;i++) printf("%d%c",ans[1][i]," \n"[i==k+1]);
//	puts("**********************");
		if(m&1)
		{
			long long g[N][N]={};
			for(int i=1;i<=k+1;i++)
				for(int l=1;l<=k+1;l++)
					for(int j=1;j<=k+1;j++)
						g[i][j]=(g[i][j]+ans[i][l]*a[l][j])%Q;
			memcpy(ans,g,sizeof(g));
		}
//	for(int i=1;i<=k+1;i++)
//		for(int j=1;j<=k+1;j++) printf("%d%c",a[i][j]," \n"[j==k+1]);
//	for(int i=1;i<=k+1;i++) printf("%d%c",ans[1][i]," \n"[i==k+1]);
//	puts("**********************");
		long long f[N][N]={};
		for(int i=1;i<=k+1;i++)
			for(int l=1;l<=k+1;l++) 
				for(int j=1;j<=k+1;j++)
					f[i][j]=(f[i][j]+a[i][l]*a[l][j])%Q;
		memcpy(a,f,sizeof(f));
		m>>=1;
	}
//	printf("****%lld %lld****\n",m,ans[1][1]);
	return ans[1][1];
}
int main()
{
	scanf("%lld",&k);
	for(int i=1;i<=k;i++) scanf("%lld",b+i);
	for(int i=1;i<=k;i++) scanf("%lld",c+i);
	scanf("%lld%lld%lld",&m,&n,&Q);
	long long s=0;
	if(n<=k)
	{
		for(int i=m;i<=n;i++) s+=b[i];
		printf("%lld\n",s);
		return 0;
	}
	if(m<=k){for(int i=m;i<=k;i++) s+=b[i];m=k+1;}
	printf("%lld\n",s+matrix_pow(n)-matrix_pow(m-1));
	return 0;
}
2024/1/14 12:28
加载中...