#include using namespace std; using Int = long long; template inline void chmin(T1 &a,T2 b){if(a>b) a=b;} template inline void chmax(T1 &a,T2 b){if(a r,p; UnionFind(){} UnionFind(Int sz):n(sz),num(sz),r(sz,1),p(sz,0){iota(p.begin(),p.end(),0);} Int find(Int x){ return (x==p[x]?x:p[x]=find(p[x])); } bool same(Int x,Int y){ return find(x)==find(y); } void unite(Int x,Int y){ x=find(x);y=find(y); if(x==y) return; if(r[x] vector compress(vector v){ sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); return v; } template map dict(const vector &v){ map res; for(Int i=0;i<(Int)v.size();i++) res[v[i]]=i; return res; } //INSERT ABOVE HERE signed main(){ Int a,b,c,d; cin>>a>>b>>c>>d; Int n; cin>>n; vector xs(n),ys(n); for(Int i=0;i>xs[i]>>ys[i]; UnionFind uf(n); { int gx=__gcd(a,c); int gy=__gcd(b,d); int dy=(gx==0?min(b,d):abs(b*(c/gx)-d*(a/gx))); int dx=(gy==0?min(a,c):abs(a*(d/gy)-c*(b/gy))); if(dy==0) dy=2e9; if(dx==0) dx=2e9; using P = pair; map mp; for(int i=0;i=0;i--){ if(mp.count(P(xs[i]%dx,ys[i]%dy))) uf.unite(i,mp[P(xs[i]%dx,ys[i]%dy)]); if(mp.count(P((xs[i]+a)%dx,(ys[i]+b)%dy))) uf.unite(i,mp[P((xs[i]+a)%dx,(ys[i]+b)%dy)]); if(mp.count(P((xs[i]+c)%dx,(ys[i]+d)%dy))) uf.unite(i,mp[P((xs[i]+c)%dx,(ys[i]+d)%dy)]); mp[P(xs[i]%dx,ys[i]%dy)]=i; } } vector vs; if((b*c-a*d)==0){ if(hypot(a,b)>hypot(c,d)) a=c,b=d; for(Int i=0;i nx; for(Int v:vs) nx.emplace_back(uf.find(v)); nx.emplace_back(uf.find(i)); vs=compress(nx); } }else{ for(Int i=0;i nx; for(Int v:vs) nx.emplace_back(uf.find(v)); nx.emplace_back(uf.find(i)); vs=compress(nx); } } cout<