AC on #7 ,其他全WA
查看原帖
AC on #7 ,其他全WA
537046
大眼仔Happy楼主2023/8/10 21:24

求助,样例过了的我瑟瑟发抖。

跪求你谷的列文虎克帮助

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=25;
int L,k;
ll n,m,mod;
ll b[N],c[N];
struct Matrix
{
    ll M[N][N];
    void clear(){memset(M,0,sizeof(M));}
    void reset(){for(int i=1;i<=L;i++)M[i][i]=1;}
    Matrix(bool isT){clear();if(isT)reset();}
    Matrix friend operator *(const Matrix A,const Matrix B)
    {
        Matrix Ans(0);
        for(int i=1;i<=L;i++)
            for(int j=1;j<=L;j++)
                for(int k=1;k<=L;k++)
                    Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j])%mod;
        return Ans;
    }
    void print()
    {
    	for(int i=1;i<=L;i++)
    	{
    		for(int j=1;j<=L;j++)
    			printf("%lld ",M[i][j]);
    		printf("\n");
    	}
    	printf("\n");
    }
};
Matrix ans(0),a(0);
ll ans1,ans2; 
Matrix QuickPow(Matrix T,ll p)
{
    Matrix Ans(1);
    while(p)
    {
        if(p&1)Ans=Ans*T;
        T=T*T;p>>=1;
    }
    return Ans;
}
void init()
{
	for(int i=1,j=k;j;i++,j--)
	{
		ans.M[i+1][1]=b[j];
		ans.M[1][1]=(ans.M[1][1]+b[j])%mod;
	}
	a.M[1][1]=1;
	for(int i=1;i<=k;i++)a.M[1][i+1]=a.M[2][i+1]=c[i];
	for(int i=3;i<=k+1;i++)a.M[i][i-1]=1;
}
ll solve(ll x)
{
	if(x<=k)
	{
		ll res=0;
		for(int i=1;i<=x;i++)res=(res+b[i])%mod;
		return res;
	}
	init();
	a=QuickPow(a,x-k);
	ans=a*ans;
	return ans.M[1][1];
}
int main(){
	scanf("%d",&k);L=k+1;
	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,&mod);
	for(int i=1;i<=k;i++)b[i]%=mod,c[i]%=mod;
	ans1=solve(n);ans2=solve(m-1);
	printf("%lld",(ans1-ans2+mod)%mod);
	return 0;
}

2023/8/10 21:24
加载中...