WA 30求助
查看原帖
WA 30求助
323849
kkksc03wzl楼主2023/8/14 23:48
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long 
using namespace std;
ll p,n,m;
int K,b[20],c[20];
struct mat{
	ll num[20][20];
	void operator=(const mat tmp){for(int i=0; i<=K; ++i)for(int j=0; j<=K; ++j)num[i][j]=tmp.num[i][j];}
	mat operator*(const mat tmp){
		mat tt;
		memset(tt.num,0,sizeof tt.num);
		for(int i=0; i<=K; ++i)
			for(int j=0; j<=K; ++j)
				for(int k=0; k<=K; ++k)
					tt.num[i][j]=(tt.num[i][j]+tmp.num[i][k]*num[k][j]%p)%p;
		return tt;
	}
};
mat Pow(mat a,ll b){
	mat ans;
	memset(ans.num,0,sizeof ans.num);
	for(int i=0; i<=K; ++i)ans.num[i][i]=1;
	while(b){
		if(b&1)ans=ans*a;
		a=a*a;
		b>>=1;
	}return ans;
}
ll solve(ll n){
	ll t=0;
	for(int i=1; i<=K; ++i)t=(t+b[i])%p;
	if(n<=K){t=0;for(int i=1; i<=n; ++i)t=(t+b[i])%p;return t;}
	mat tmp;memset(tmp.num,0,sizeof tmp.num);
	tmp.num[0][0]=1;
	for(int i=1; i<=K; ++i)tmp.num[0][i]=tmp.num[1][i]=c[K-i+1]%p;
	for(int i=2; i<=K; ++i)tmp.num[i][i-1]=1;
	mat ans;memset(ans.num,0,sizeof ans.num);
	for(int i=1; i<=K; ++i)ans.num[i][0]=b[K-i+1]%p;
	ans.num[0][0]=t;
	tmp=Pow(tmp,n-K);
	return (ans*tmp).num[0][0];
}
int main(){
	scanf("%d",&K);
	for(int i=1; i<=K; ++i)scanf("%d",&b[i]);
	for(int i=1; i<=K; ++i)scanf("%d",&c[i]);
	scanf("%lld%lld%lld",&m,&n,&p);
	printf("%lld\n",(solve(n)-solve(m-1)+p)%p);
	return 0;
}
2023/8/14 23:48
加载中...