Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <algorithm>
- using namespace std;
- ifstream cin("euclid.in");
- ofstream cout("euclid.out");
- int R[10][10][401][401], E[401];
- int main()
- {
- int t,n,m,h,w;
- cin>>t;
- for(int i = 2;i<=400;i++)
- E[i] = E[i/2] + 1;
- for(int testcase = 1;testcase<=t;testcase++)
- {
- cin>>n>>m>>h>>w;
- for(int i = 1;i<=n;i++)
- for(int j = 1;j<=m;j++)
- cin>>R[0][0][i][j];
- for(int q = 0; (1<<q)<= n; q++)
- for(int p = 0;(1<<p)<=m;p++)
- for(int i = 1;i<=n;i++)
- for(int j = 1;j<=m;j++)
- {
- int f1 = i + (1<<(max(q-1,0)));
- int f2 = j + (1<<(max(p-1,0)));
- R[q][p][i][j] = R[max(q-1,0)][max(p-1,0)][i][j];
- if(f1<=n)
- R[q][p][i][j] = __gcd(R[q][p][i][j],R[(q-1,0)][max(q-1,0)][f1][j]);
- if(f2<=m)
- R[q][p][i][j] = __gcd(R[q][p][i][j],R[max(q-1,0)][max(p-1,0)][i][f2]);
- if(f1<=n&&f2<=m)
- R[q][p][i][j] = __gcd(R[q][p][i][j],R[max(q-1,0)][max(p-1,0)][f1][f2]);
- }
- int sol = -1e9;
- for(int i = 1;i<=n-h+1;i++)
- for(int j = 1;j<=m-w+1;j++)
- {
- int e1 = E[h];
- int e2 = E[w];
- int len1 = (1<<e1);
- int len2 = (1<<e2);
- int val1 = R[e1][e2][i][j];
- int val2 = R[e1][e2][i+h-len1][j];
- int val3 = R[e1][e2][i][j+w-len2];
- int val4 = R[e1][e2][i+h-len1][j+w-len2];
- int current = __gcd(__gcd(val1,val2),__gcd(val3,val4));
- sol = max(sol,current);
- }
- cout<<"Case #"<<testcase<<": "<<sol<<'\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement