样例都过不了,样例2执行qpow的时候执行五六次就莫名其妙RE了,很玄学,调了2个小时没调出来不要在意我码风太丑了qwq
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1000000007;
int x1,x2,x,mx;
struct mat{
int s[105][105];
mat operator * (const mat o)const{
mat a1;
for(int i=1;i<=mx;i++)
for(int j=1;j<=mx;j++)a1.s[i][j]=0;
for(int i=1;i<=mx;i++)
for(int j=1;j<=mx;j++)
for(int k=1;k<=mx;k++)
a1.s[i][j]+=s[i][k]*o.s[k][j],a1.s[i][j]%=mod;
return a1;
}
}A;
int n;
int m[105],num[105],f[105];
mat qpow(int a){
if(a==1)return A;
mat tmp=qpow(a/2);
if(a%2)return tmp*tmp*A;
return tmp*tmp;
}
signed main(){
cin>>n;
cin>>x1;
for(int i=1;i<=x1;i++){
int s;
cin>>s;
m[s]++;
}
cin>>x2;
for(int i=1;i<=x2;i++){
int s;
cin>>s;
m[s]++;
}
for(int i=1;i<=100;i++){
if(m[i]==2)num[++x]=i,mx=i;
}
for(int i=1;i<=x;i++){
A.s[1][num[i]]=1;
}
for(int i=1;i<=mx;i++){
A.s[i+1][i]=1;
}
f[0]=1;
for(int i=1;i<=mx;i++){
for(int j=1;j<=x;j++){
if(i>=num[j]){
f[i]+=f[i-num[j]];
f[i]%=mod;
}
}
}
mat ans;
for(int i=1;i<=mx;i++)ans.s[i][1]=f[mx-i];
ans=ans*qpow(n-mx+1);
cout<<ans.s[1][1];
return 0;
}