#include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; int tab[45]; int zera[45]; int ile[155][155]; int x, y, k, pomoc, licz_x, licz_y, min_x, max_x, min_y, max_y, diff_x, diff_y; unsigned int X, Y, result; vector < pair <int, int> > v; bool comp (pair <int, int> F, pair <int, int> S) { return (F.first * S.second < S.first * F.second); } int main () { scanf("%d%d%d", &x, &y, &k); X = (unsigned int)(x); Y = (unsigned int)(y); if (k <= 4) { result = (X - 1) * (Y - 1); cout << result << endl; return 0; } if (k <= 12) { v.push_back(make_pair(0, 1)); v.push_back(make_pair(3, 4)); v.push_back(make_pair(4, 3)); v.push_back(make_pair(1, 0)); v.push_back(make_pair(4, -3)); v.push_back(make_pair(3, -4)); v.push_back(make_pair(0, -1)); v.push_back(make_pair(-3, -4)); v.push_back(make_pair(-4, -3)); v.push_back(make_pair(-1, 0)); v.push_back(make_pair(-4, 3)); v.push_back(make_pair(-3, 4)); for (int i = 0; i < 4096; ++i) { pomoc = i; licz_x = licz_y = min_x = max_x = min_y = max_y = 0; for (int j = 0; j < 12; ++j) { tab[j] = pomoc % 2; pomoc /= 2; if (tab[j] == 1) { licz_x += v[j].first; licz_y += v[j].second; if (licz_x > max_x) max_x = licz_x; else if (licz_x < min_x) min_x = licz_x; if (licz_y > max_y) max_y = licz_y; else if (licz_y < min_y) min_y = licz_y; } } if (licz_x != 0) continue; if (licz_y != 0) continue; for (int j = 12; j < 18; ++j) tab[j] = tab[j - 12]; pomoc = 0; if (tab[0] == 0) zera[0] = 1; else zera[0] = 0; for (int j = 1; j < 18; ++j) { if (tab[j] == 1) zera[j] = 0; else zera[j] = zera[j - 1] + 1; if (zera[j] == 5) { pomoc = 1; break; } } if (pomoc == 1) continue; diff_x = max_x - min_x; diff_y = max_y - min_y; if (x <= diff_x) continue; if (y <= diff_y) continue; result += (unsigned int)(x - diff_x) * (unsigned int)(y - diff_y); } cout << result << endl; return 0; } if (k <= 16) { v.push_back(make_pair(0, 1)); v.push_back(make_pair(5, 12)); v.push_back(make_pair(3, 4)); v.push_back(make_pair(4, 3)); v.push_back(make_pair(12, 5)); v.push_back(make_pair(1, 0)); v.push_back(make_pair(12, -5)); v.push_back(make_pair(4, -3)); v.push_back(make_pair(3, -4)); v.push_back(make_pair(5, -12)); v.push_back(make_pair(0, -1)); v.push_back(make_pair(-5, -12)); v.push_back(make_pair(-3, -4)); v.push_back(make_pair(-4, -3)); v.push_back(make_pair(-12, -5)); v.push_back(make_pair(-1, 0)); v.push_back(make_pair(-12, 5)); v.push_back(make_pair(-4, 3)); v.push_back(make_pair(-3, 4)); v.push_back(make_pair(-5, 12)); for (int i = 0; i < 1048576; ++i) { pomoc = i; licz_x = licz_y = min_x = max_x = min_y = max_y = 0; for (int j = 0; j < 20; ++j) { tab[j] = pomoc % 2; pomoc /= 2; if (tab[j] == 1) { licz_x += v[j].first; licz_y += v[j].second; if (licz_x > max_x) max_x = licz_x; else if (licz_x < min_x) min_x = licz_x; if (licz_y > max_y) max_y = licz_y; else if (licz_y < min_y) min_y = licz_y; } } if (licz_x != 0) continue; if (licz_y != 0) continue; for (int j = 20; j < 30; ++j) tab[j] = tab[j - 20]; pomoc = 0; if (tab[0] == 0) zera[0] = 1; else zera[0] = 0; for (int j = 1; j < 30; ++j) { if (tab[j] == 1) zera[j] = 0; else zera[j] = zera[j - 1] + 1; if (zera[j] == 9) { pomoc = 1; break; } } if (pomoc == 1) continue; diff_x = max_x - min_x; diff_y = max_y - min_y; if (x <= diff_x) continue; if (y <= diff_y) continue; result += (unsigned int)(x - diff_x) * (unsigned int)(y - diff_y); } cout << result << endl; return 0; } cout << "0" << endl; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | #include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; int tab[45]; int zera[45]; int ile[155][155]; int x, y, k, pomoc, licz_x, licz_y, min_x, max_x, min_y, max_y, diff_x, diff_y; unsigned int X, Y, result; vector < pair <int, int> > v; bool comp (pair <int, int> F, pair <int, int> S) { return (F.first * S.second < S.first * F.second); } int main () { scanf("%d%d%d", &x, &y, &k); X = (unsigned int)(x); Y = (unsigned int)(y); if (k <= 4) { result = (X - 1) * (Y - 1); cout << result << endl; return 0; } if (k <= 12) { v.push_back(make_pair(0, 1)); v.push_back(make_pair(3, 4)); v.push_back(make_pair(4, 3)); v.push_back(make_pair(1, 0)); v.push_back(make_pair(4, -3)); v.push_back(make_pair(3, -4)); v.push_back(make_pair(0, -1)); v.push_back(make_pair(-3, -4)); v.push_back(make_pair(-4, -3)); v.push_back(make_pair(-1, 0)); v.push_back(make_pair(-4, 3)); v.push_back(make_pair(-3, 4)); for (int i = 0; i < 4096; ++i) { pomoc = i; licz_x = licz_y = min_x = max_x = min_y = max_y = 0; for (int j = 0; j < 12; ++j) { tab[j] = pomoc % 2; pomoc /= 2; if (tab[j] == 1) { licz_x += v[j].first; licz_y += v[j].second; if (licz_x > max_x) max_x = licz_x; else if (licz_x < min_x) min_x = licz_x; if (licz_y > max_y) max_y = licz_y; else if (licz_y < min_y) min_y = licz_y; } } if (licz_x != 0) continue; if (licz_y != 0) continue; for (int j = 12; j < 18; ++j) tab[j] = tab[j - 12]; pomoc = 0; if (tab[0] == 0) zera[0] = 1; else zera[0] = 0; for (int j = 1; j < 18; ++j) { if (tab[j] == 1) zera[j] = 0; else zera[j] = zera[j - 1] + 1; if (zera[j] == 5) { pomoc = 1; break; } } if (pomoc == 1) continue; diff_x = max_x - min_x; diff_y = max_y - min_y; if (x <= diff_x) continue; if (y <= diff_y) continue; result += (unsigned int)(x - diff_x) * (unsigned int)(y - diff_y); } cout << result << endl; return 0; } if (k <= 16) { v.push_back(make_pair(0, 1)); v.push_back(make_pair(5, 12)); v.push_back(make_pair(3, 4)); v.push_back(make_pair(4, 3)); v.push_back(make_pair(12, 5)); v.push_back(make_pair(1, 0)); v.push_back(make_pair(12, -5)); v.push_back(make_pair(4, -3)); v.push_back(make_pair(3, -4)); v.push_back(make_pair(5, -12)); v.push_back(make_pair(0, -1)); v.push_back(make_pair(-5, -12)); v.push_back(make_pair(-3, -4)); v.push_back(make_pair(-4, -3)); v.push_back(make_pair(-12, -5)); v.push_back(make_pair(-1, 0)); v.push_back(make_pair(-12, 5)); v.push_back(make_pair(-4, 3)); v.push_back(make_pair(-3, 4)); v.push_back(make_pair(-5, 12)); for (int i = 0; i < 1048576; ++i) { pomoc = i; licz_x = licz_y = min_x = max_x = min_y = max_y = 0; for (int j = 0; j < 20; ++j) { tab[j] = pomoc % 2; pomoc /= 2; if (tab[j] == 1) { licz_x += v[j].first; licz_y += v[j].second; if (licz_x > max_x) max_x = licz_x; else if (licz_x < min_x) min_x = licz_x; if (licz_y > max_y) max_y = licz_y; else if (licz_y < min_y) min_y = licz_y; } } if (licz_x != 0) continue; if (licz_y != 0) continue; for (int j = 20; j < 30; ++j) tab[j] = tab[j - 20]; pomoc = 0; if (tab[0] == 0) zera[0] = 1; else zera[0] = 0; for (int j = 1; j < 30; ++j) { if (tab[j] == 1) zera[j] = 0; else zera[j] = zera[j - 1] + 1; if (zera[j] == 9) { pomoc = 1; break; } } if (pomoc == 1) continue; diff_x = max_x - min_x; diff_y = max_y - min_y; if (x <= diff_x) continue; if (y <= diff_y) continue; result += (unsigned int)(x - diff_x) * (unsigned int)(y - diff_y); } cout << result << endl; return 0; } cout << "0" << endl; return 0; } |