Rezolvare completă PbInfo #1146 Greieri

Pe o linie orizontală se găsesc n greieri. Ei încep să stea „capră” într-o ordine prestabilită începând cu ultimul, pe rând, până la primul. Toţi greierii care îl preced pe cel care stă „capră” sar peste acesta, în ordine.

De exemplu pentru n=4, mai întâi stă „capră” greierul 4 și peste el sar, în ordine, 3, 2 și 1. Apoi stă „capră” greierul 3 și sar peste el, în ordine, 2, 1 și 4. Apoi stă „capră” greierul 2 și peste el sar, în ordine, 1, 3 și 4. Apoi stă „capră” greierul 1 și sar peste el, în ordine, 4 , 3 și 2, și se revine la ordinea inițială.

Cerință

Scrieți un program care citește numerele naturale n și m și determină:

a) De câte sărituri este nevoie pentru a se ajunge la ordinea inițială?
b) Cum vor fi așezați greierii după m sărituri?

Date de intrare

Fișierul de intrare greieri.in conține două valori n și m, separate printr-un spațiu, cu semnificația din enunț.

Date de ieșire

Fișierul de ieșire greieri.out va conține:

  • pe prima linie o valoare ce reprezintă numărul de sărituri după care se revine la ordinea inițială;
  • pe a doua linie numerele ce reprezintă ordinea greierilor după m pași.

Restricții și precizări

  • 2 ≤ n ≤ 100000;
  • 1 ≤ m ≤ 2000000000;

Exemplu

greieri.in

4 5

greieri.out

12
4 3 1 2

Explicație

După cum se vede și în imagine pornind de la linia inițială 1 2 3 4 la primul pas sare greierele 3 peste 4 , la pasul 2 sare greierele 2 peste 4 , la pasul trei sare greierele 1 peste 4 la pasul patru sare greierele 2 peste 3, iar la pasul cinci sare greierele 1 peste 3.

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 Greieri:

#include <fstream>
using namespace std;

ifstream fin("greieri.in");
ofstream fout("greieri.out");

int main()
{
    long long n, m, i, r, c, k, p, s=1;
    fin>>n>>m;
    fout<<n*(n-1)<<"
";
    m=m%(n*(n-1));
    c=m/(n-1);
    r=m%(n-1);
    k=n-r;
    p=n-c;
    for(i=n-c+1;i<=n;i++)
    {
        if(s==k) fout<<p<<" ";
        fout<<i<<" ";
        s++;
    }
    for(i=1;i<n-c;i++)
    {
        if(s==k) fout<<p<<" ";
        fout<<i<<" ";
        s++;
    }
    if(!r) fout<<p;
}

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 #1146 Greieri

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1146 Greieri 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!