Pagini recente » Cod sursa (job #1587783) | Cod sursa (job #1621830) | Cod sursa (job #1523944) | Cod sursa (job #2816985) | Cod sursa (job #3229570)
#include <fstream>
#include <iostream>
std::ifstream in("euclid.in");
std::ofstream out("euclid.out");
int rmq[9][9][401][401];
int log_table[401];
int t, m, n, h, w;
int gcd(int a, int b) {
if (a % b == 0)
return b;
if (b % a == 0)
return a;
return gcd(a % b, b % a);
}
inline int gcd4(int a, int b, int c, int d) {
return gcd(gcd(a, b), gcd(c, d));
}
void calc_rmq() {
for (int lg1 = 0; (1 << lg1) <= m; lg1++) {
for (int lg2 = 0; (1 << lg2) <= n; lg2++) {
for (int i = 1; i <= m - (1 << lg1) + 1; i++) {
for (int j = 1; j <= n - (1 << lg2) + 1; j++) {
int A = 0, B = 0, C = 0, D = 0;
if (lg1 != 0) {
A = lg1 - 1;
C = 1 << A;
}
if (lg2 != 0) {
B = lg2 - 1;
D = 1 << B;
}
rmq[A + (lg1 != 0)][B + (lg2 != 0)][i][j] =
gcd4(rmq[A][B][i][j], rmq[A][B][i][j + D], rmq[A][B][i + C][j],
rmq[A][B][i + C][j + D]);
}
}
}
}
}
inline int get_area_gcd(int i, int j) {
int lg1 = log_table[h], lg2 = log_table[w];
return gcd4(rmq[lg1][lg2][i][j], rmq[lg1][lg2][i][j + w - (1 << lg2)],
rmq[lg1][lg2][i + h - (1 << lg1)][j],
rmq[lg1][lg2][i + h - (1 << lg1)][j + w - (1 << lg2)]);
}
void solve(int test) {
int max_gcd = 1;
for (int i = 1; i <= m - h + 1; i++) {
for (int j = 1; j <= n - h + 1; j++) {
max_gcd = std::max(max_gcd, get_area_gcd(i, j));
}
}
out << "Case #" << test << ": " << max_gcd << '\n';
}
int main() {
for (int i = 2; i <= 400; i++) {
log_table[i] = log_table[i / 2] + 1;
}
in >> t;
for (int test = 1; test <= t; test++) {
in >> m >> n >> h >> w;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= m; j++) {
in >> rmq[0][0][i][j];
}
}
calc_rmq();
solve(test);
}
}