#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long ll;
const int Mod=1e9+7;
const int M=15010;
ll w;
ll dp[M];//dp[j] 前i件物品选出之后为j的方法数
ll d1[M],d2[M];
ll a[161],b[161];
void Onezero(ll *a,ll *d,int n)
{
memset(d,0,sizeof(d));
d[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=w;j>=a[i];j--)
{
if(d[j-a[i]])
d[j]=(d[j-a[i]]+d[j])%Mod;
//cout<<j<<"@"<<d[j]<<" ";
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
long long ans=0;
int n,m,k;
memset(d1,0,sizeof(d1));
memset(d2,0,sizeof(d2));
cin>>n>>m>>k>>w;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
scanf("%d",&b[i]);
Onezero(a,d1,n);
Onezero(b,d2,m);
for(int s1=0;s1<=w;s1++)
{
int s2=w-s1;
if(abs(s2-s1)<=k)
{
ans=(ans+d1[s1]*d2[s2])%Mod;
}
}
cout<<ans<<endl;
}
return 0;
}
CF gym Coins(01背包计数)
最新推荐文章于 2023-03-13 20:26:56 发布