VinstaG173 @ 2020-01-14 18:24:59
#include<cstdio>
#define ll long long
const int o=1e9+7;
struct Matrix
{
int v[107][107],n,m;
}M;
Matrix operator *(Matrix a,Matrix b)
{
Matrix c;c.n=a.n,c.m=b.m;
for(int i=0;i<a.n;++i)
{
for(int j=0;j<b.m;++j)
{
c.v[i][j]=0;
for(int k=0;k<a.m;++k)
{
c.v[i][j]=(c.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%o;
}
}
}
return c;
}
struct Vector
{
int v[107],n;
}V;
Vector operator *(Vector a,Matrix b)
{
Vector c;c.n=a.n;
for(int i=0;i<a.n;++i)
{
c.v[i]=0;
for(int j=0;j<b.n;++j)
{
c.v[i]=(c.v[i]+1ll*a.v[j]*b.v[j][i])%o;
}
}
return c;
}
ll N;
int PR,NF,x,maxx;
int can[2][107];
int main()
{
scanf(" %d",&N);
scanf(" %d",&PR);
for(int i=0;i<PR;++i)
{
scanf(" %d",&x);can[0][x]=1;(maxx<x)&&(maxx=x);
}
scanf(" %d",&NF);
for(int i=0;i<NF;++i)
{
scanf(" %d",&x);can[1][x]=1;(maxx<x)&&(maxx=x);
}
M.n=M.m=V.n=maxx;
for(int i=0;i<maxx;++i)
{
x=i+1;
if(can[0][x]&&can[1][x])M.v[i][0]=1;
M.v[i][x]=1;
}
V.v[0]=1;
while(N)
{
(N&1)&&(V=V*M,1),M=M*M,N>>=1;
}
printf("%d\n",V.v[0]);
return 0;
}
by AThousandSuns @ 2020-01-14 18:25:38
stO
by 1saunoya @ 2020-01-14 18:26:55
@AThousandSuns Orz
by VinstaG173 @ 2020-01-14 18:30:01
@AThousandSuns @Isaunoya 请不要只%啊,救救蒟蒻啊
by hater @ 2020-01-14 19:07:16
@Isaunoya orz
by Johnsonloy @ 2022-04-29 11:24:44
同样是WA了4,5个点……