悬关,#4#5TLE求助
查看原帖
悬关,#4#5TLE求助
174477
sdyzpf楼主2023/12/16 15:54
#include<bits/stdc++.h>
using namespace std;
class matrix{	
	private:
		int mod;
		void indentity(int n){
			this->n=this->m=n;
			for(int i=1;i<=n;i++) a[i][i]=1;
		}
	public:
		int n,m;
		long long a[105][105];
		matrix(){
			mod=1e9+7;
			memset(a,0,sizeof(a));
		}
		matrix operator*(matrix b){
			matrix c;
			c.n=this->n;
			c.m=b.m;
			for(int i=1;i<=c.n;i++)
				for(int k=1;k<=100;k++) 
				    if(this->a[i][k])
				        for(int j=1;j<=100;j++) c.a[i][j]=(c.a[i][j]+this->a[i][k]*b.a[k][j]%mod)%mod;
			return c;
		} 	
		matrix operator^(long long x){
			matrix res,a=(*this);
			res.indentity(this->n);
			while(x){
				if(x&1) res=res*a;
				a=a*a,x>>=1;
			}
			return res;
		}
		friend istream& operator>>(istream& cin,matrix& c){
			cin>>c.n>>c.m;
			for(int i=1;i<=c.n;i++)
				for(int j=1;j<=c.m;j++) cin>>c.a[i][j];
			return cin;
		}
		friend ostream& operator<<(ostream& cout,matrix c){
			cout<<c.n<<' '<<c.m<<'\n';
			for(int i=1;i<=c.n;i++){
				for(int j=1;j<=c.m;j++) cout<<c.a[i][j]<<' ';
				cout<<'\n';
			}
		return cout;
	}	
};
long long n,mod=1e9+7;
long long dp[105];
int pr,nf;
set<int> t,t1;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>pr;
	for(int i=1;i<=pr;i++){
		int x;
		cin>>x;
		t1.emplace(x);
	}
	cin>>nf;
	for(int i=1;i<=nf;i++){
		int x;
		cin>>x;
		if(t1.find(x)!=t1.end()) t.emplace(x);
	}
	dp[0]=1;
	for(int i=1;i<=99;i++)
		for(int v:t)
			if(v<=i) dp[i]=(dp[i]+dp[i-v])%mod;
	matrix x,y;
	x.n=1,x.m=100;
	for(int i=1;i<=100;i++) x.a[1][i]=dp[100-i];
	y.m=100,y.n=100;
	for(int v:t) y.a[v][1]=1;
	for(int i=2;i<=100;i++) y.a[i-1][i]=1;
	cout<<(x*(y^n)).a[1][100];
	return 0;
}

2023/12/16 15:54
加载中...