#include <iostream>
#include <vector>
#include <string>
#include <numeric>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stack>
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
long long h, w;
long long r = 0;
std::stack<std::pair<long long, long long>> wall;
std::cin >> h >> w;
wall.push(std::make_pair(h, w));
long long n;
std::cin >> n;
std::vector<long long> dimensions(n);
for (int i = 0; i < n; i++)
{
std::cin >> dimensions[i];
}
while (!wall.empty())
{
std::pair<long long, long long> current = wall.top();
wall.pop();
bool found = false;
long long height = current.first;
long long width = current.second;
for (int i = n - 1; i >= 0; i--)
{
if (dimensions[i] <= height && dimensions[i] <= width)
{
long long inHeight = height / dimensions[i];
long long inWidth = width / dimensions[i];
r += inHeight * inWidth;
if (inHeight * dimensions[i] < height)
{
wall.push(std::make_pair(height - inHeight * dimensions[i], width));
if (inWidth * dimensions[i] < width)
{
wall.push(std::make_pair(height - (height - inHeight * dimensions[i]), width - inWidth * dimensions[i]));
}
}
else if (inWidth * dimensions[i] < width)
{
wall.push(std::make_pair(height, width - inWidth * dimensions[i]));
}
found = true;
break;
}
}
if (!found)
{
std::cout << -1 << std::endl;
return 0;
}
}
std::cout << r << std::endl;
}
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 | #include <iostream> #include <vector> #include <string> #include <numeric> #include <algorithm> #include <map> #include <set> #include <queue> #include <stack> int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); long long h, w; long long r = 0; std::stack<std::pair<long long, long long>> wall; std::cin >> h >> w; wall.push(std::make_pair(h, w)); long long n; std::cin >> n; std::vector<long long> dimensions(n); for (int i = 0; i < n; i++) { std::cin >> dimensions[i]; } while (!wall.empty()) { std::pair<long long, long long> current = wall.top(); wall.pop(); bool found = false; long long height = current.first; long long width = current.second; for (int i = n - 1; i >= 0; i--) { if (dimensions[i] <= height && dimensions[i] <= width) { long long inHeight = height / dimensions[i]; long long inWidth = width / dimensions[i]; r += inHeight * inWidth; if (inHeight * dimensions[i] < height) { wall.push(std::make_pair(height - inHeight * dimensions[i], width)); if (inWidth * dimensions[i] < width) { wall.push(std::make_pair(height - (height - inHeight * dimensions[i]), width - inWidth * dimensions[i])); } } else if (inWidth * dimensions[i] < width) { wall.push(std::make_pair(height, width - inWidth * dimensions[i])); } found = true; break; } } if (!found) { std::cout << -1 << std::endl; return 0; } } std::cout << r << std::endl; } |
English