Rezolvare completă PbInfo #1107 Reflex

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).

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Reflex:

#include <iostream>
#include <iomanip>
#include <fstream>

using namespace std;


long cmmdc(long a, long b)
{
    while (a!=b)
      {
          if (a>b)
             a=a-b;
          else
             b=b-a;
      }
    return a;
}

int main()
{
    long n,m,N,M,CMMDC,nl,nh;
    long long s;
    int colt=0;
    ifstream inFile;
    ofstream outFile;
    // citire date din fis
    inFile.open("reflex.in");
    outFile.open("reflex.out");
    inFile >> n >> m;
    N=n-1;
    M=m-1;
    CMMDC=cmmdc(N,M);
    // CMMMC = N * M / CMMDC;
    nl=N/CMMDC;
    nh=M/CMMDC;
    if (nl%2==0)
         colt=4;
    else
       if (nh%2==0)
          colt=2;
       else
          colt=3;
    s = nl;
    s = s * M + 1;
    outFile << s << " " << colt << "
";
    outFile << nh -1 << " " << nl -1 << "
";


    inFile.close();
    outFile.close();
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1107 Reflex

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1107 Reflex de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!