La un concurs de robotică, în timpul prezentării, un roboţel cu corp cilindric cu diametrul de o unitate scapă de sub control şi se deplasează într-un ring de formă dreptunghiulară. Ringul este împărţit în N x M
pătrate identice, cu latura de o unitate, aşezate pe N
linii şi M
coloane.
Robotul poate părăsi ringul numai pe la colţuri, acestea fiind numerotate de la 1
la 4
, colţul cu numărul 1
fiind cel din stânga jos apoi restul fiind numerotate în sens trigonometric. Suprafaţa ringului este delimitată de exterior prin intermediul a patru pereţi despărţitori: doi pereţi “verticali” (aşezaţi de la colţul 1
la colţul 4
, respectiv de la colţul 2
la colţul 3
) şi doi pereţi “orizontali” (aşezaţi de la colţul 1
la colţul 2
, respectiv de la colţul 3
la colţul 4
), fără a bloca ieşirile, ca în desenul alăturat.
Robotul pătrunde în ring prin colţul cu numărul 1
sub un unghi de 45
grade şi cu o viteză de un pătrat/s. Ciocnirile cu pereţii sunt considerate perfect elastice (robotul nu-şi pierde din viteză) iar unghiul de incidenţă este egal cu cel de reflexie.
Cerinţe
Se cere să se determine:
a) după câte secunde şi prin ce colţ al ringului va ieşi robotul;
La un concurs de robotică, în timpul prezentării, un roboţel cu corp cilindric cu diametrul de o unitate scapă de sub control şi se deplasează într-un ring de formă dreptunghiulară. Ringul este împărţit în N x M
pătrate identice, cu latura de o unitate, aşezate pe N
linii şi M
coloane.
Robotul poate părăsi ringul numai pe la colţuri, acestea fiind numerotate de la 1
la 4
, colţul cu numărul 1
fiind cel din stânga jos apoi restul fiind numerotate în sens trigonometric. Suprafaţa ringului este delimitată de exterior prin intermediul a patru pereţi despărţitori: doi pereţi “verticali” (aşezaţi de la colţul 1
la colţul 4
, respectiv de la colţul 2
la colţul 3
) şi doi pereţi “orizontali” (aşezaţi de la colţul 1
la colţul 2
, respectiv de la colţul 3
la colţul 4
), fără a bloca ieşirile, ca în desenul alăturat.
Robotul pătrunde în ring prin colţul cu numărul 1
sub un unghi de 45
grade şi cu o viteză de un pătrat/s. Ciocnirile cu pereţii sunt considerate perfect elastice (robotul nu-şi pierde din viteză) iar unghiul de incidenţă este egal cu cel de reflexie.
Cerinţe
Se cere să se determine:
a) după câte secunde şi prin ce colţ al ringului va ieşi robotul;
b) de câte ori se ciocneşte robotul de pereţii orizontali şi verticali, rezultând o schimbare de direcţie, până la ieşirea din ring.
Date de intrare
Fișierul de intrare reflex.in
conține pe prima linie două numere naturale N
şi M
, separate printr-un singur spaţiu.
Date de ieșire
Fișierul de ieșire reflex.out
va conține pe prima linie două numere naturale S
și C
, separate printr-un singur spațiu, S
reprezentând numărul de secunde după care robotul va ieşi din ring, iar C
reprezintă numărul colţului prin care acesta va ieşi. Pe a doua linie, fişierul de ieşire va conține două numere naturale H
şi V
, separate printr-un spaţiu, H
reprezentând numărul de ciocniri cu pereţii orizontali ai ringului, iar V
numărul de ciocniri cu pereţii verticali.
Restricții și precizări
3 ≤ N, M ≤ 2 000 000 000
- Pentru rezolvarea corectă a unei singure cerinţe se acordă 50% din punctaj, iar pentru rezolvarea corectă a ambelor cerinţe se acordă 100% din punctaj.
Exemplul 1
reflex.in
3 6
reflex.out
11 4 4 1
Explicație
Până la ieşire se parcurg 11 pătrate, ieşirea se produce pe la colţul 4
. Se produc 4
ciocniri cu pereţii orizontali şi o ciocnire cu pereţii verticali.
Exemplul 2
reflex.in
5 7
reflex.out
13 4 2 1
Explicație
Se parcurg 13
pătrate, ieşirea se face la colţul 4
şi de produc 2
ciocniri cu pereţii orizontali (în punctele a
şi c
respectiv o ciocnire cu pereţii verticali în punctul b
).
#include<fstream> using namespace std; ifstream cin("reflex.in"); ofstream cout("reflex.out"); long long a , b , s , c , x , y , r , a1 , b1; int colt[3]={2 , 4 , 3}; int main() { cin >> a >> b; a1 = a-1; b1 = b-1; while(b1!=0){r = a1 % b1; a1 = b1; b1 = r;} x = (b - 1) / a1; y = (a - 1) / a1; c = colt[y % 2 + (x % 2)*2 - 1]; s = y * (b - 1); cout << s + 1 << " " << c << '\n' << x - 1 << " " << y - 1; return 0; }