MnZn求助,WA #4 RE #5
查看原帖
MnZn求助,WA #4 RE #5
542905
WannaYellow楼主2022/11/7 20:20
#include<bits/stdc++.h>

using i8=char;
using u8=unsigned char;
using i16=short;
using u16=unsigned short;
using i32=int;
using u32=unsigned int;
using i64=long long;
using u64=unsigned long long;
using i128=__int128;
using u128=unsigned __int128;
using f32=float;
using f64=double;
using f128=long double;

template<typename T> void read(T &x){
	char ch=getchar(),f=1;
	x=0;
	while(ch<'0'||ch>'9')f=(ch=='-')?-1:1,ch=getchar();
	while(ch>='0'&&ch<='9')(x=x*10+(ch-'0')),ch=getchar();
	x*=f;
}
template<typename T,typename ...Ts> void read(T &x,Ts &...xs){
	read(x);
	read(xs...);
}
template<typename T> void write(T x){
	if(x<0)putchar('-'),x=-x;
	else if(x>9)write(x/10);
	putchar((x%10)^48);
}
template<typename T> void writesp(T x){
	write(x);
	putchar(' ');
}
template<typename T> void writeln(T x){
	write(x);
	putchar('\n');
}
template<typename T> void writelns(T x){
	writeln(x);
}
template<typename T,typename ...Ts> void write(T x,Ts ...xs){
	writesp(x);
	write(xs...);
}
template<typename T,typename ...Ts> void writeln(T x,Ts ...xs){
	write(x,xs...);
	putchar('\n');
}
template<typename T,typename ...Ts> void writelns(T x,Ts ...xs){
	writeln(x);
	writelns(xs...);
}
const i32 p=1e9+7;
struct Mat{
	i32 r,c;
	i32 m[105][105];
	void clear(){for(i32 i=1;i<=this->r;i++)for(i32 j=1;j<=this->c;j++)this->m[i][j]=0;}
	Mat(i32 _r=0,i32 _c=0):r(_r),c(_c){this->clear();}
	void resize(i32 r,i32 c){this->r=r,this->c=c;this->clear();}
	Mat operator*(const Mat &x)const{
		Mat re(this->r,x.c);
		for(i32 i=1;i<=re.r;++ i){
			for(i32 j=1;j<=re.c;++j){
				for(i32 k=1;k<=x.r;++k){
					re.m[i][j]+=((i64)this->m[i][k])*x.m[k][j]%p;
					re.m[i][j]%=p;
				}
			}
		}
		return re;
	}
	Mat& operator*=(const Mat &x){
		*this=*this*x;
		return *this;
	}
}st,unit;
i32 n,size;
i32 buc[2][105];
std::basic_string<i32> a;
Mat qp(const Mat &x,int y){
	if(y==1)return x;
	Mat tmp=qp(x,y>>1);
	tmp*=tmp;
	return (y&1)?tmp*x:tmp;
}
int main(){
#ifdef LOCAL
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	freopen("test.err","w",stderr);
#endif
	read(n);
	i32 t;
	read(t);
	for(i32 i=1;i<=t;i++){
		i32 x;
		read(x);
		buc[0][x]++;
	}
	read(t);
	for(i32 i=1;i<=t;i++){
		i32 x;
		read(x);
		buc[1][x]++;
	}
	for(i32 i=100;i>=1;--i){
		if(buc[0][i]&&buc[1][i]){
			if(!size)size=i,unit.resize(size,size),st.resize(size,1);
			unit.m[1][i]=1;
			a+=i;
		}
	}
	for(i32 i=2;i<=size;i++){
		unit.m[i][i-1]=1;
	}
	std::reverse(a.begin(),a.end());
	st.m[size+1][1]=1;
	for(i32 i=1;i<=size;i++){
		for(auto j:a){
			if(j>i)break;
			st.m[size+1-i][1]+=st.m[size+1-i+j][1];
			st.m[size+1-i][1]%=p;
		}
	}
	if(n<=size){
		write(st.m[size-n+1][1]);
		return 0;
	}else{
		unit=qp(unit,n-size);
		unit*=st;
	}
	write(unit.m[1][1]);
	return 0;
}

如上。

2022/11/7 20:20
加载中...