/*表示刚刚接触dp。这是我接触到的第3道dp题,刚开始以为是要用dfs+dp,后来栈溢出。。。仔细想想,
其实这道题和数塔差不多,只要每步都得到最优子结构,最后结果一定是最优的。题目的初始化要做好,这样
可以避免很多的麻烦*/
#include"iostream"
#include"stdio.h"
#include"algorithm"
#include"string.h"
#include"cmath"
#include"queue"
#include"stdlib.h"
#define inf -32766
using namespace std;
int n,m;
int dp[25][1005];
void init()
{
for(int i=0;i<=n;i++) {dp[0][i]=inf;dp[i][0]=inf;}
dp[1][0]=dp[0][1]=0;
}
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
int i,j,k;
init();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>dp[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
int ans=inf;
for(k=1;k<j;k++)
{
if(j%k==0) ans=max(ans,dp[i][k]);
}
ans=max(ans,dp[i][j-1]);
dp[i][j]+=max(ans,dp[i-1][j]); //最优子结构对应最优结果
}
cout<<dp[n][m]<<endl;
}
return 0;
}