Se dă o tablă de șah cu n+1
linii (numerotate de sus în jos începând cu 1
) și 2n+1
coloane (numerotate de la stânga la dreapta începând cu 1
). Pe prima linie pătratul din mijloc conține 1
gram de fân, iar celelalte pătrate de pe prima linie nu conțin nimic. Începând cu linia a doua fiecare pătrat conține o cantitate de fân obținută prin adunarea cantităților de fân din cele 3
pătrate ale liniei anterioare cu care se învecinează (pe verticală și diagonală). De exemplu dacă n=3
tabla are 4
linii, 7
coloane și următoarea configurație.
Un cal pleacă de pe prima linie, de pe o coloana k<=n
, sare din orice poziție (i,j)
în poziția (i+1,j+2)
atât timp cât este posibil și mănâncă tot fânul din pătratele prin care trece. De exemplu, pentru n=3
și k=2
, pătratele prin care trece calul sunt marcate cu asterisc ( * )
Cerinţe
1. Cunoscând n
și k
, să se calculeze cantitatea de fân de pe linia k
a tablei.
2. Cunoscând n
și k
, să se calculeze câte grame de fân mănâncă un cal care pleacă de pe prima linie, de pe coloana k
.
Întrucât aceste numere pot fi mari, se cere doar restul modulo 100003
ale acestor numere.
Date de intrare
Fișierul de intrare p2sah.in
conține pe prima linie un număr t
cu valoarea 1
sau 2
. Pe a doua linie a fișierului de intrare se găsesc două numere naturale n
și k
separate printr-un spațiu.
Dacă t=1
se va rezolva prima cerință, deci pentru valoarea n
citită tabla are n+1
linii și 2n+1
coloane, iar k
reprezintă numărul liniei de pe care trebuie calculată cantitatea de fân.
Dacă t=2
se va rezolva a doua cerință, deci pentru valoarea n
citită tabla are n+1
linii și 2n+1
coloane, iar k
reprezintă numărul coloanei din prima linie de unde pleacă calul.
Date de ieșire
Dacă t
din fișierul de intrare este 1
se va rezolva doar prima cerință.
În acest caz fișierul de ieșire p2sah.out
va conține un singur număr reprezentând cantitatea totală de fân din toate pătratele situate pe tabla pe linia k
(trebuie afișat restul modulo 100003
).
Dacă t
din fișierul de intrare este 2
se va rezolva doar a doua cerință.
În acest caz fișierul de ieșire p2sah.out
va conține un singur număr reprezentând cantitatea totală de fân mâncată de un cal care pleacă de pe linia 1
și coloana k
(trebuie afișat restul modulo 100003
).
Restricții și precizări
1 <= k <= n <= 1000000000 (un miliard)
- La cerința 1 pentru 80% dintre teste
k <= n <= 1000000
, iar pentru alte 20% din testek <= n <= 1000000000
- La cerința 2 pentru 30% dintre teste
k <= n <= 1000
, pentru alte 30% dintre testek <= n <= 1000000
, iar pentru restul de 40% dintre testek <= n <= 1000000000
. - Rezolvarea corectă a primei cerințe asigură 30% din punctajul testului respectiv.
- Rezolvarea corectă a celei de a doua cerințe asigura 70% din punctajul testului respectiv.
Exemplul 1
p2sah.in
1 3 2
p2sah.out
3
Explicație
t=1
, deci se rezolvă prima cerință.
Pe linia a doua există 3
pătrate care conțin fiecare câte un gram de fân.(vezi desenul din enunț)
Exemplul 2
p2sah.in
2 3 2
p2sah.out
2
Explicație
t=2
, deci se rezolvă a doua cerință.
Traseul calului este: (1,2) -> (2,4) -> (3,6)
adică exact pătrățelele marcate cu asterisc în desenul din enunț. Prima poziție nu conține fân, iar celelalte două conțin câte un gram de fân. Deci calul mănâncă 2
grame de fân.
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 p2sah:
//Problema 2sah - solutia oficiala O(log N)
//Sursa: Panaete Adrian
#include <fstream>
#define tip long long
#define MOD 100003
using namespace std;
ifstream f("p2sah.in");
ofstream g("p2sah.out");
tip t,n,k,A[3][3],S[3][3],C[3][3];
void sol1(),sol2();
int main()
{
f>>t>>n>>k;
if(t==1)sol1();
else sol2();
return 0;
}
void sol1()
{
tip ans=1,p=3;
for(k--;k;k>>=1)
{
if(k%2)ans=(ans*p)%MOD;
p=(p*p)%MOD;
}
g<<ans;
}
void sol2()
{
int i,j,q;
k=n+2-k;
for(i=0;i<3;i++)
{
S[i][i]=1;
A[2][i]=1;
}
A[0][1]=A[1][2]=1;
for(;k;k>>=1)
{
if(k%2)
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
C[i][j]=0;
for(q=0;q<3;q++)
C[i][j]=(C[i][j]+S[i][q]*A[q][j])%MOD;
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
S[i][j]=C[i][j];
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
C[i][j]=0;
for(q=0;q<3;q++)
C[i][j]=(C[i][j]+A[i][q]*A[q][j])%MOD;
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
A[i][j]=C[i][j];
}
g<<S[1][2];
}
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 #1135 p2sah
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1135 p2sah 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!