#include typedef long long ll; typedef unsigned long long ull; #define FOR(i,a,b) for(int (i)=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define RANGE(vec) (vec).begin(),(vec).end() using namespace std; template T gcd(T a, T b) { if ( a < b ) std::swap(a,b); if ( b == 0 ) return a; return gcd(b, a%b); } class Rebellion { public: void solve(void) { int Q; cin>>Q; // H,W の制約が小さいので 1 クエリにたいして O(16^2*4) <= 1024 程度 // 同じ (x,y) 座標で方向が同じ場合ループになるので D は最大 1050 程度まで調べれば良い // シミュレーションで十分間に合う REP(q,Q) { int W,H,Mx,My,Hx,Hy; ll D,Vx,Vy; cin>>W>>H>>D>>Mx>>My>>Hx>>Hy>>Vx>>Vy; // 格子点を移動させるため Vx,Vy は互いに素になるようにしておく ll k = gcd(abs(Vx),abs(Vy)); Vx /= k; Vy /= k; D = min(1050LL, D*k); int x,y; x = Hx; y = Hy; bool hit = false; for (int d = 1; d <= D; ++d) { // 1 秒経過ごとに移動させる x += Vx; y += Vy; if (x < 0) { Vx *= -1; x *= -1; } if (x > W-1) { Vx *= -1; x = 2*W-x; } if (y < 0) { Vy *= -1; y *= -1; } if (y > H-1) { Vy *= -1; y = 2*H-y; } if (x == Mx && y == My) { hit = true; break; } } if (hit) cout<<"Hit"<solve(); delete obj; return 0; } #endif