#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;
}
如上。