    
#include <bits/stdc++.h>
#define pb      push_back
#define fastIO  ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL);
#define PI      3.141592653589793238462643383
#define mp      make_pair
#define ff      first
#define ss      second
#define endl    "\n"
#define all(v)  v.begin(),v.end()
#define int     long long

using namespace std;
typedef pair<int,int> pii;
typedef pair<long double,long double>pdd;
template<class T>
using max_pq = priority_queue<T>;
template<class T>
using min_pq = priority_queue<T,vector<T>,greater<T> >;

vector<string> split(const string& s, char c) {
    vector<string> v; stringstream ss(s); string x;
    while (getline(ss, x, c)) v.emplace_back(x); return move(v);
}
template<typename T, typename... Args>
inline string arrStr(T arr, int n) {
    stringstream s; s << "[";
    for(int i = 0; i < n - 1; i++) s << arr[i] << ",";
        if(n > 0)
            s << arr[n - 1] ;
        s<< "]";
        return s.str();
    }
#define TRACE
#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
    template <typename Arg1>
    void __f(const char* name, Arg1&& arg1){
        cerr << name << " : " << arg1 << endl;
    }
    template <typename Arg1, typename... Args>
    void __f(const char* names, Arg1&& arg1, Args&&... args){
        const char* comma = strchr(names + 1, ','); cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
    }
#else
#define trace(...)
#endif
const int N=20,MAXN=250000,INF=1e18;

int sz,h,arr1[N],arr2[N];
vector<int> t[4*MAXN];
vector<pii> v1,v2;

void brute(int day, int n, vector<pii> &v, int h1, int h2)
{
    if(day==n+1)
    {
        v.pb({h1,h2});
        return;
    }
    brute(day+1,n,v,h1+arr1[day],h2);
    brute(day+1,n,v,h1,h2+arr2[day]);
    brute(day+1,n,v,h1+arr1[day],h2+arr2[day]);
}


void build(vector<pii> a, int v, int tl, int tr) {
    if (tl == tr) {
        t[v] = vector<int>(1, a[tl].ss);
    } else { 
        int tm = (tl + tr) / 2;
        build(a, v*2, tl, tm);
        build(a, v*2+1, tm+1, tr);
        merge(t[v*2].begin(), t[v*2].end(), t[v*2+1].begin(), t[v*2+1].end(),
              back_inserter(t[v]));
    }
}

int query(int v, int tl, int tr, int l, int r, int x) {
    if (l > r)
        return 0;
    if (l == tl && r == tr) {
        auto pos = lower_bound(t[v].begin(), t[v].end(), x);
        return (t[v].end()-pos);
    }
    int tm = (tl + tr) / 2;
    return query(v*2, tl, tm, l, min(r, tm), x)+ query(v*2+1, tm+1, tr, max(l, tm+1), r, x);
}

int32_t main()
{
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    freopen("debug.txt", "w", stderr);
    #endif

    fastIO;

    int testcases;cin>>testcases;
    for(int test=1;test<=testcases;test++)
    {
        cin>>sz>>h;
        memset(t,0,sizeof(t));
        for(int i=1;i<=sz;i++)
        {
            cin>>arr1[i];
        }
        for(int i=1;i<=sz;i++)
        {
            cin>>arr2[i];
        }
        int n=sz/2;
        int m=sz-n;
        v1.clear();v2.clear();
        brute(1,n,v1,0,0);
        brute(n+1,sz,v2,0,0);
        sort(all(v2));
        build(v2,1,0,v2.size()-1);
        int ans=0;
        for(int i=0;i<v1.size();i++)
        {
            int r=v2.size()-1;
            auto it=lower_bound(all(v2),pii(h-v1[i].ff,0));
            int l=(it-v2.begin());
            int tmp=query(1,0,v2.size()-1,l,r,h-v1[i].ss);
            if(tmp!=INF)
            {
                ans+=tmp;
            }
        }
        cout<<"Case #"<<test<<": "<<ans<<endl;
    }
    
    return 0;
}
