コード
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
struct point{ll x, y;};
ll possible_steps(ll cur, ll step, ll max_pos){
if(step == 0) return 0;
if(step > 0){
return (max_pos - cur) / step;
}
else{
return (1 - cur) / step;
}
}
int main(int argc, char *argv[]){
ll n, m, xc, yc, k;
point pos;
cin >> n >> m >> xc >> yc >> k;
pos.x = xc;
pos.y = yc;
ll ret = 0;
for(ll i = 0; i < k; i++){
point step;
cin >> step.x >> step.y;
ll n_step;
if(step.x == 0){
n_step = possible_steps(pos.y, step.y, m);
}
else if(step.y == 0){
n_step = possible_steps(pos.x, step.x, n);
}
else{
n_step = min(possible_steps(pos.x, step.x, n),
possible_steps(pos.y, step.y, m));
}
pos.x += n_step * step.x;
pos.y += n_step * step.y;
ret += n_step;
}
cout << ret << endl;
return 0;
}