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ă
mpaș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
.
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!