枚举最大公因数k, 判断矩阵内k的倍数能否形成一条路线,左上到右下。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 200010;
int gcd(int a, int b)
{
if(a < b) swap(a, b);
while(b)
{
int t = a % b;
a = b;
b = t;
}
return a;
}
int main()
{
//cout << gcd(12,12);/*
int t;
cin >> t;
while(t --)
{
int n, m;
cin >> n >> m;
vector<vector<int> > a(n, vector<int>(m));
vector<vector<int> > dp(n, vector<int>(m));
for (int i = 0; i < n; i ++)
for (int j = 0; j < m; j ++)
cin >> a[i][j];
int ans = 1, g = gcd(a[0][0], a[n-1][m-1]);
for (int x = 1; x * x <= g; x ++)
{
if(g % x > 0) continue;
vector<int> cand = {x, g / x};
for (int dl : cand)
{
for (int i = 0; i < n; i ++) dp[i].assign(m, 0);
dp[0][0] = 1;
for (int i = 0; i < n; i ++)
{
for (int j = 0; j < m; j ++)
{
if(a[i][j] % dl > 0) continue;
if(!dp[i][j] && i)
dp[i][j] = dp[i - 1][j];
if(!dp[i][j] && j)
dp[i][j] = dp[i][j - 1] ;
}
}
if(dp[n-1][m-1]) ans = max(ans, dl);
}
}
cout << ans << endl;
}
return 0;
}