求助,只有#7过了,其他WA
查看原帖
求助,只有#7过了,其他WA
405894
233L楼主2021/8/21 19:23

因为怕溢出所以就全开ull了

#include<bits/stdc++.h>
#define ull unsigned long long
#define K 20
using namespace std;
ull k,mod;
ull l,r;
ull b[K],c[K];
struct mat{
	ull n,m;
	ull a[K][K]={};
	void times(mat u){
		m=u.m;
		ull b[K][K]={};
		for(ull i=1;i<=n;i++)
			for(ull j=1;j<=m;j++)
				for(ull y=1;y<=u.n;y++){
					b[i][j]+=a[i][y]*u.a[y][j]%mod;
					b[i][j]%=mod;
				}
		
		for(ull i=1;i<=n;i++)
			for(ull j=1;j<=m;j++)
				a[i][j]=b[i][j];
	}
}a,base,unit;


void input(){
	scanf("%lld",&k);
	for(ull i=1;i<=k;i++)
		scanf("%lld",&b[i]);
	for(ull i=1;i<=k;i++)
		scanf("%lld",&c[i]);
	scanf("%lld%lld%lld",&l,&r,&mod);
}
void create_a(){
	a.n=1,a.m=k+1;
	for(ull i=1;i<=k;i++)
		a.a[1][i]=b[i];
	for(ull i=1;i<k;i++){
		a.a[1][k+1]+=b[i];
		a.a[1][k+1]%=mod;
	}
}
void create_base(){
	base.n=base.m=k+1;
	for(ull i=1;i<k;i++)
		base.a[i+1][i]=1;
	for(ull i=1;i<=k;i++)
		base.a[i][k]=c[k-i+1];
	base.a[k][k+1]=1;
	base.a[k+1][k+1]=1;
}
void create_unit(){
	unit.n=unit.m=k+1;
	for(ull i=1;i<=k+1;i++)
		unit.a[i][i]=1;
}
void init(){
	input();
	create_base();
	create_unit();
}
mat qpow(mat u,ull v){
	mat re=unit;
	while(v){
		if(v&1)
			re.times(u);
		u.times(u);
		v>>=1;
	}
	return re;
}
int main(){
	init();
	
	ull sum1=0,sum2=0;
	
	if((l-1)-k+1){
		create_a();
		a.times(qpow(base,(l-1)-k+1));
		sum1=a.a[1][k+1];
	}
	else
		for(ull i=1;i<l;i++){
			sum1+=b[i];
			sum1%=mod;
		}
	//sum[l-1]
	
	if(r-k+1){
		create_a();
		a.times(qpow(base,r-k+1));
		sum2=a.a[1][k+1];
	}
	else
		for(ull i=1;i<=r;i++){
			sum2+=b[i];
			sum2%=mod;
		}
	//sum[r]
	
	printf("%lld",(sum2-sum1+mod)%mod);
}
2021/8/21 19:23
加载中...