#include <bits/stdc++.h>
#define ll long long
#define llu long long unsigned
#define ld long double
#define fr(i,n) for(int i=0;i<n;i++)
#define watch(x) cout<<(#x)<<"=="<<(x)<<endl
#define ft first
#define sc second
#define mp make_pair
#define pb push_back
#define vi vector<int>
#define pii pair<int,int>
#define pll pair<ll,ll>
#define P 1000000007llu
#define N 35
#define M 1000001
#define LC 262144
using namespace std;
int getchar_pos_int() {
int n=0, c=getchar();
while('0'<=c&&c<='9') {n=n*10+c-'0'; c=getchar();}
return n;
}
int d[N];
ll f(int h, int w, int i) {
//printf("Preorder: h=%d w=%d i=%d\n",h,w,i);
if(!h||!w) return 0;
if(i<0&&h>0&&w>0) return -1;///!!!
if(d[i]>min(h,w)) return f(h,w,i-1);
int x=(w/d[i])*d[i], y=(h/d[i])*d[i];
//printf("preorder h=%d y=%d w=%d x=%d\n",h,y,w,x);
ll f1=f(h-y,x,i-1), f2=f(y,w-x,i-1), f3=f(h-y,w-x,i-1);
//watch(w);watch(h);watch(i);watch(d[i]);watch(x);watch(y);watch(f1);watch(f2);watch(f3);
if(f1==-1||f2==-1||f3==-1) return -1;
//printf("Postorder: x/d[%d]=%d y/d[%d]=%d res=%lld\n",i,x/d[i],i,y/d[i],(x/d[i])*(y/d[i])+f1+f2+f3);
return (x/d[i])*(y/d[i])+f1+f2+f3;
}
int main() {
int h=getchar_pos_int(),w=getchar_pos_int(),n=getchar_pos_int();
fr(i,n) d[i]=getchar_pos_int();
printf("%lld",f(h,w,n-1));
}
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 | #include <bits/stdc++.h> #define ll long long #define llu long long unsigned #define ld long double #define fr(i,n) for(int i=0;i<n;i++) #define watch(x) cout<<(#x)<<"=="<<(x)<<endl #define ft first #define sc second #define mp make_pair #define pb push_back #define vi vector<int> #define pii pair<int,int> #define pll pair<ll,ll> #define P 1000000007llu #define N 35 #define M 1000001 #define LC 262144 using namespace std; int getchar_pos_int() { int n=0, c=getchar(); while('0'<=c&&c<='9') {n=n*10+c-'0'; c=getchar();} return n; } int d[N]; ll f(int h, int w, int i) { //printf("Preorder: h=%d w=%d i=%d\n",h,w,i); if(!h||!w) return 0; if(i<0&&h>0&&w>0) return -1;///!!! if(d[i]>min(h,w)) return f(h,w,i-1); int x=(w/d[i])*d[i], y=(h/d[i])*d[i]; //printf("preorder h=%d y=%d w=%d x=%d\n",h,y,w,x); ll f1=f(h-y,x,i-1), f2=f(y,w-x,i-1), f3=f(h-y,w-x,i-1); //watch(w);watch(h);watch(i);watch(d[i]);watch(x);watch(y);watch(f1);watch(f2);watch(f3); if(f1==-1||f2==-1||f3==-1) return -1; //printf("Postorder: x/d[%d]=%d y/d[%d]=%d res=%lld\n",i,x/d[i],i,y/d[i],(x/d[i])*(y/d[i])+f1+f2+f3); return (x/d[i])*(y/d[i])+f1+f2+f3; } int main() { int h=getchar_pos_int(),w=getchar_pos_int(),n=getchar_pos_int(); fr(i,n) d[i]=getchar_pos_int(); printf("%lld",f(h,w,n-1)); } |
English