#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define int long long
#define mkp make_pair
#define pb push_back
#define ff first
#define ss second
#define debug1(a) cout<<a<<endl;
#define debug2(a,b) cout<<a<<' '<<b<<endl;
#define debug3(a,b,c) cout<<a<' '<<b<<' '<<c<<endl;
#define rep(i,n) for(int i=0;i<n;i++)
#define repr(i,a,b)for(int i=a;i<b;i++)
#define repre(i,a,b)for(int i=a;i<=b;i++)
#define clr1(arr) memset(arr,-1,sizeof(arr));
#define clr0(arr) memset(arr,0,sizeof(arr));
#define pi pair<int,int>
#define pii pair<int,pi>
#define all(v) v.begin(),v.end()
#define pq priority_queue
#define mpq priority_queue<int,vector<int>,greater<int> >
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
using namespace __gnu_pbds;
using namespace std;
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> orderedSet;
typedef tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update> orderedMSet;
//*p.find_by_order(index) return value at index
//p.order_of_key(key) return index
/*
2d pointer array
int **dp;
in main function
int row,col;
dp=new int*[n];
rep(i,n)dp[i]=new int[m]
*/
int32_t main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
fastio
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int arr[n];
rep(i,n)cin>>arr[i];
int arr2[m];
rep(i,m)cin>>arr2[i];
int dp[n+m];
clr0(dp);
rep(i,n)
{
rep(j,m)
{
dp[i+j]=dp[i+j]+arr[i]*arr2[j];
}
}
repre(i,0,n+m-2)cout<<dp[i]<<" ";
cout<<endl;
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGU8ZXh0L3BiX2RzL2Fzc29jX2NvbnRhaW5lci5ocHA+CiNpbmNsdWRlPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIG1rcCBtYWtlX3BhaXIKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBmZiBmaXJzdAojZGVmaW5lIHNzIHNlY29uZAojZGVmaW5lIGRlYnVnMShhKSBjb3V0PDxhPDxlbmRsOwojZGVmaW5lIGRlYnVnMihhLGIpIGNvdXQ8PGE8PCcgJzw8Yjw8ZW5kbDsKI2RlZmluZSBkZWJ1ZzMoYSxiLGMpIGNvdXQ8PGE8JyAnPDxiPDwnICc8PGM8PGVuZGw7CiNkZWZpbmUgcmVwKGksbikgZm9yKGludCBpPTA7aTxuO2krKykKI2RlZmluZSByZXByKGksYSxiKWZvcihpbnQgaT1hO2k8YjtpKyspCiNkZWZpbmUgcmVwcmUoaSxhLGIpZm9yKGludCBpPWE7aTw9YjtpKyspCiNkZWZpbmUgY2xyMShhcnIpIG1lbXNldChhcnIsLTEsc2l6ZW9mKGFycikpOwojZGVmaW5lIGNscjAoYXJyKSBtZW1zZXQoYXJyLDAsc2l6ZW9mKGFycikpOwojZGVmaW5lIHBpIHBhaXI8aW50LGludD4KI2RlZmluZSBwaWkgcGFpcjxpbnQscGk+CiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSx2LmVuZCgpCiNkZWZpbmUgcHEgcHJpb3JpdHlfcXVldWUKI2RlZmluZSBtcHEgcHJpb3JpdHlfcXVldWU8aW50LHZlY3RvcjxpbnQ+LGdyZWF0ZXI8aW50PiA+CiNkZWZpbmUgZmFzdGlvIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpO2Npbi50aWUoTlVMTCk7Y291dC50aWUoTlVMTCk7CnVzaW5nIG5hbWVzcGFjZSBfX2dudV9wYmRzOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0eXBlZGVmIHRyZWU8aW50LG51bGxfdHlwZSxsZXNzPGludD4scmJfdHJlZV90YWcsdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPiBvcmRlcmVkU2V0Owp0eXBlZGVmIHRyZWU8aW50LG51bGxfdHlwZSxsZXNzX2VxdWFsPGludD4scmJfdHJlZV90YWcsdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPiBvcmRlcmVkTVNldDsKLy8qcC5maW5kX2J5X29yZGVyKGluZGV4KSByZXR1cm4gdmFsdWUgYXQgaW5kZXgKLy9wLm9yZGVyX29mX2tleShrZXkpIHJldHVybiBpbmRleAovKgoyZCBwb2ludGVyIGFycmF5CmludCAqKmRwOwppbiBtYWluIGZ1bmN0aW9uCmludCByb3csY29sOwpkcD1uZXcgaW50KltuXTsKcmVwKGksbilkcFtpXT1uZXcgaW50W21dCiovCmludDMyX3QgbWFpbigpCnsKICAvL2ZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOwogIC8vZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKICBmYXN0aW8KICBpbnQgdDsKICBjaW4+PnQ7CiAgd2hpbGUodC0tKQogIHsKICAgIGludCBuLG07CiAgICBjaW4+Pm4+Pm07CiAgICBpbnQgYXJyW25dOwogICAgcmVwKGksbiljaW4+PmFycltpXTsKICAgIGludCBhcnIyW21dOwogICAgcmVwKGksbSljaW4+PmFycjJbaV07CiAgICBpbnQgZHBbbittXTsKICAgIGNscjAoZHApOwogICAgcmVwKGksbikKICAgIHsKICAgICAgcmVwKGosbSkKICAgICAgewogICAgICAgIGRwW2kral09ZHBbaStqXSthcnJbaV0qYXJyMltqXTsKICAgICAgfQogICAgfQogICAgcmVwcmUoaSwwLG4rbS0yKWNvdXQ8PGRwW2ldPDwiICI7CiAgICBjb3V0PDxlbmRsOwogIH0KCiAgcmV0dXJuIDA7Cn0K