#include<bits/stdc++.h>
using namespace std;
long long sizes[50];
long long solveVertical(long long indexOfWidth, long long height)
{
//cerr<<"solveVertical "<<indexOfWidth<<" "<<height<<endl;
long long originalWidth = sizes[indexOfWidth];
long long result = 0;
long long heightRemaining = height;
while (heightRemaining>0)
{
//cerr<<"adding "<<heightRemaining/sizes[indexOfWidth]*originalWidth/sizes[indexOfWidth]<<" of "<<sizes[indexOfWidth]<<endl;
result+=heightRemaining/sizes[indexOfWidth]*originalWidth/sizes[indexOfWidth];
heightRemaining = heightRemaining % sizes[indexOfWidth];
indexOfWidth++;
}
//cerr<<"returned "<<result<<" from vertical"<<endl;
return result;
}
long long solveHorizontal(long long n, long long remainingH, long long remainingW, long long startingI)
{
////cerr<<"solveHorizontal "<<remainingH<<" "<<remainingW<<" "<<startingI<<endl;
long long result=0;
if(remainingW==0)
return 0;
for(long long i=startingI;i<n;i++)
{
if(remainingW>=sizes[i] && remainingH>=sizes[i])
{
long long w = max(remainingW, remainingH);
long long h = min(remainingH, remainingW);
//////cerr<<"solution horizontal with "<<sizes[i]<<endl;
auto s = solveVertical(i,h);
//cerr<<"vertical multiplied = "<<s <<" * "<< w/sizes[i]<<" = " << s*(w/sizes[i]) << endl;
return s * (w/sizes[i]) + solveHorizontal(n, h, w % sizes[i], i+1);
}
}
return 0;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
long long h,w,n,a;
cin>>h>>w>>n;
for(long long i=0;i<n;i++)
cin>>sizes[i];
sort(sizes,sizes+n, greater<long long>());
if(h%sizes[n-1] + w% sizes[n-1]>0)
{
cout<<-1;
return 0;
}
cout<<solveHorizontal(n, min(h,w), max(h,w),0);
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 | #include<bits/stdc++.h> using namespace std; long long sizes[50]; long long solveVertical(long long indexOfWidth, long long height) { //cerr<<"solveVertical "<<indexOfWidth<<" "<<height<<endl; long long originalWidth = sizes[indexOfWidth]; long long result = 0; long long heightRemaining = height; while (heightRemaining>0) { //cerr<<"adding "<<heightRemaining/sizes[indexOfWidth]*originalWidth/sizes[indexOfWidth]<<" of "<<sizes[indexOfWidth]<<endl; result+=heightRemaining/sizes[indexOfWidth]*originalWidth/sizes[indexOfWidth]; heightRemaining = heightRemaining % sizes[indexOfWidth]; indexOfWidth++; } //cerr<<"returned "<<result<<" from vertical"<<endl; return result; } long long solveHorizontal(long long n, long long remainingH, long long remainingW, long long startingI) { ////cerr<<"solveHorizontal "<<remainingH<<" "<<remainingW<<" "<<startingI<<endl; long long result=0; if(remainingW==0) return 0; for(long long i=startingI;i<n;i++) { if(remainingW>=sizes[i] && remainingH>=sizes[i]) { long long w = max(remainingW, remainingH); long long h = min(remainingH, remainingW); //////cerr<<"solution horizontal with "<<sizes[i]<<endl; auto s = solveVertical(i,h); //cerr<<"vertical multiplied = "<<s <<" * "<< w/sizes[i]<<" = " << s*(w/sizes[i]) << endl; return s * (w/sizes[i]) + solveHorizontal(n, h, w % sizes[i], i+1); } } return 0; } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); long long h,w,n,a; cin>>h>>w>>n; for(long long i=0;i<n;i++) cin>>sizes[i]; sort(sizes,sizes+n, greater<long long>()); if(h%sizes[n-1] + w% sizes[n-1]>0) { cout<<-1; return 0; } cout<<solveHorizontal(n, min(h,w), max(h,w),0); return 0; } |
English