60求助
查看原帖
60求助
254491
橙橙like海绵楼主2022/1/16 11:58
#include<bits/stdc++.h>
#define ll long long
const int Mod=1e9+7;
const int N=1e6+10;
ll n,p,f,cnt=0;
int t[105];
ll a[N];
ll fi[N];
int size=100;
using namespace std;
struct mx{
	ll g[105][105];
	mx(){
		memset(g,0,sizeof(g));
	}
};
mx mul(mx x,mx y){
	mx res;
	for(int i=1;i<=size;i++)
		for(int j=1;j<=size;j++)
			for(int k=1;k<=size;k++) res.g[i][j]=(res.g[i][j]+x.g[i][k]*y.g[k][j]%Mod)%Mod;
	return res;
}
mx fpow(mx v,int k){
	mx base=v;
	mx res;
	for(int i=1;i<=size;i++) res.g[i][i]=1;
	while(k){
		if(k&1) res=mul(res,base);
		base=mul(base,base);
		k=k>>1;
	}
	return res;
}
void pr(mx a)
{
	cout<<"pr"<<endl; 
	for(int i=1;i<=size;i++)
	{
		for(int j=1;j<=size;j++)
		{
			cout<<a.g[i][j]<<" ";
		}
		cout<<endl;
	}
	cout<<endl;
}
signed main(){
	scanf("%lld",&n);
	scanf("%lld",&p);
	int tmp;
	for(int i=1;i<=p;i++) scanf("%d",&tmp),t[tmp]++;
	scanf("%lld",&f);
	for(int i=1;i<=f;i++)
	{
		scanf("%d",&tmp);
		if (t[tmp] == 1)
		{
			t[tmp] ++;
			a[++cnt] = tmp;
		}
	} 
	sort(a + 1,a + cnt + 1);
	fi[0]=1;
	if(n<=1e6){
			for(int i=1;i<=n;i++){
			for(int j=1;j<=cnt;j++){
				fi[i]=(fi[i]+fi[i-a[j]])%Mod;
			}
		}
		cout<<fi[n];
		return 0;
	}

	
	mx base;
	for(int i=1;i<=cnt;i++) base.g[1][a[i]]=1;
	for(int i=2;i<=size;i++) base.g[i][i-1]=1;
/*	mx ans;//pr(base);
	for(int i=1;i<=size;i++) ans.g[1][i]=fi[size-i+1];*/
	
	base=fpow(base,n);
	cout<<base.g[1][1];
	/*ans=mul(base,ans);pr(ans);
	cout<<endl;
	if(n<size) printf("%d",fi[n]);
	else printf("%d",ans.g[1][1]);*/
	

	return 0;
	/*
2
7
8 9 6 3 7 2 1
7
4 5 2 9 7 8 3*/
}
2022/1/16 11:58
加载中...