#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair<int,int> PII;
#define X first
#define Y second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=100010,inf=1e9;
int T,n,Mino[maxn<<2],Minv[maxn<<2],tag[maxn<<2];
LL a[maxn],b[maxn],pre[maxn],Maxpos[maxn];
void maintain(int L,int R,int o)
{
int mid=L+R>>1,lo=o<<1,ro=lo|1;
Mino[o]=min(Mino[lo],Mino[ro]);
if(Mino[lo]==Mino[ro])Minv[o]=max(Minv[lo],Minv[ro]);
else if(Mino[lo]<Mino[ro])Minv[o]=Minv[lo];
else Minv[o]=Minv[ro];
}
void build(int L,int R,int o)
{
if(L==R)
{
Mino[o]=b[L];
Minv[o]=L;
tag[o]=0;
return;
}
int mid=L+R>>1,lo=o<<1,ro=lo|1;
build(L,mid,lo);
build(mid+1,R,ro);
maintain(L,R,o);
tag[o]=0;
}
void pushdown(int o)
{
int lo=o<<1,ro=lo|1;
Mino[lo]-=tag[o];Mino[ro]-=tag[o];
tag[lo]+=tag[o];tag[ro]+=tag[o];
tag[o]=0;
}
PII query(int L,int R,int o,int ql,int qr)
{
if(L==ql && qr==R)
{
return make_pair(Minv[o],Mino[o]);
}
pushdown(o);
int mid=L+R>>1,lo=o<<1,ro=lo|1;
PII res;
if(qr<=mid)res=query(L,mid,lo,ql,qr);
else if(ql>mid)res=query(mid+1,R,ro,ql,qr);
else
{
PII ans1=query(L,mid,lo,ql,mid),ans2=query(mid+1,R,ro,mid+1,qr);
if(ans1.Y<ans2.Y)res=ans1;
else if(ans1.Y>ans2.Y)res=ans2;
else res=make_pair(max(ans1.X,ans2.X),ans1.Y);
}
maintain(L,R,o);
return res;
}
void update(int L,int R,int o,int ql,int qr,int plus)
{
if(L==ql && R==qr)
{
Mino[o]=Mino[o]-plus;
tag[o]+=plus;
return;
}
pushdown(o);
int mid=L+R>>1,lo=o<<1,ro=lo|1;
if(qr<=mid)update(L,mid,lo,ql,qr,plus);
else if(ql>mid)update(mid+1,R,ro,ql,qr,plus);
else update(L,mid,lo,ql,mid,plus),update(mid+1,R,ro,mid+1,qr,plus);
maintain(L,R,o);
return;
}
void print(__int128 x)
{
if (!x) return ;
if (x < 0) putchar('-'),x = -x;
print(x / 10);
putchar(x % 10 + '0');
}
int main()
{
T=read();
for(int Case=1;Case<=T;Case++)
{
n=read();
for(int i=1;i<=n;i++)a[i]=read(),pre[i]=pre[i-1]+a[i];
for(int i=1;i<=n;i++)b[i]=read();
build(1,n,1);
printf("Case #%d: %lld ",Case,b[1]);
__int128 ans=(__int128)b[1]*(__int128)a[1];
Maxpos[1]=1;
for(int i=2;i<=n;i++)
{
if(pre[i]>pre[Maxpos[i-1]])Maxpos[i]=i;
else Maxpos[i]=Maxpos[i-1];
}
int r=Maxpos[n],cnt=0;
while(r>=2 && cnt<=b[1])
{
PII tmp=query(1,n,1,2,r);
if(tmp.Y<=0)
{
r=Maxpos[tmp.X-1];
continue;
}
ans+=(__int128)tmp.Y*(__int128)(pre[r]-pre[1]);
cnt+=tmp.Y;
if(cnt>b[1]){
ans-=(__int128)(cnt-b[1])*(__int128)(pre[r]-pre[1]);
break;
}
update(1,n,1,2,r,tmp.Y);
r=Maxpos[tmp.X-1];
}
print(ans);
puts("");
}
return 0;
}