Переберём все целые числа x, удовлетворяющие неравенству 0

advertisement
Ïåðåáåð¼ì âñå öåëûå ÷èñëà x, óäîâëåòâîðÿþùèå íåðàâåíñòâó 0 ≤ x < L + d, è äëÿ
êàæäîãî èç íèõ ïðîâåðèì, ÿâëÿåòñÿ ëè äàííîå ÷èñëî ðåøåíèåì çàäà÷è.
Êàê ïðîâåðèòü, ÿâëÿåòñÿ ëè çàäàííîå ÷èñëî x ðåøåíèåì çàäà÷è? Äëÿ ýòîãî íóæíî
ïðîâåðèòü, ÷òî íà êàæäîì ôàíòèêå öåëèêîì ðàñïîëîæåíà ðîâíî îäíà êàðòèíêà.
Ââåä¼ì âåëè÷èíó pi ðàññòîÿíèå îò íà÷àëà i-ãî ôàíòèêà äî áëèæàéøåé êàðòèíêè,
öåëèêîì ëåæàùåé ïðàâåå åãî íà÷àëà. Âåëè÷èíà pi õàðàêòåðèçóåò èçîáðàæåíèå íà i-ì
ôàíòèêå, ò. å. òî, ÷òî íà í¼ì íàïå÷àòàíî.
 êàêîì ñëó÷àå íà i-ì ôàíòèêå öåëèêîì ðàñïîëîæåíà ðîâíî îäíà êàðòèíêà? Áëèæàéøàÿ êàðòèíêà, öåëèêîì ëåæàùàÿ ïðàâåå íà÷àëà i-ãî ôàíòèêà, áóäåò öåëèêîì íàõîäèòüñÿ íà ýòîì ôàíòèêå, åñëè è òîëüêî åñëè pi + L ≤ W . À ñëåäóþùàÿ êàðòèíêà
íå áóäåò öåëèêîì ðàñïîëàãàòüñÿ íà ýòîì ôàíòèêå â òîì è òîëüêî òîì ñëó÷àå, åñëè
pi + 2L + d > W . Èòàê, íà i-ì ôàíòèêå öåëèêîì ðàñïîëîæåíà ðîâíî îäíà êàðòèíêà
òîãäà è òîëüêî òîãäà, êîãäà
W − 2L − d < pi ≤ W − L.
Îñòàëîñü âû÷èñëèòü pi. Ìîæíî äîêàçàòü, ÷òî
pi = (a − x − (i − 1)W ) mod (L + d).
Òàêæå ìîæíî èñïîëüçîâàòü ôîðìóëû:
p1 = (a − x) mod (L + d),
pi+1 = (pi − W ) mod (L + d), i = 1, . . . , N − 1.
Îòìåòèì, ÷òî ïðè âû÷èñëåíèè îñòàòêà îò äåëåíèÿ îòðèöàòåëüíîãî ÷èñëà íà äðóãîå
÷èñëî íåîáõîäèìî ïðèáàâèòü ê äåëèìîìó äîñòàòî÷íî áîëüøîå ÷èñëî, êðàòíîå äåëèòåëþ, ïîòîìó ÷òî ïðè íàõîæäåíèè îñòàòêà îò äåëåíèÿ îòðèöàòåëüíîãî ÷èñëà íà äðóãîå
÷èñëî îïåðàöèÿ mod ðàáîòàåò íåïðàâèëüíî.
program
var
L, d,
x, i,
flag:
cut;
a, N, W: integer;
p: integer;
boolean;
function mod2(a, b: integer): integer;
begin
while (a < 0) do
a := a + b;
Result := a mod b;
end;
begin
read(L, d, a, N, W);
1
for x := 0 to L+d-1 do
begin
flag := true;
for i := 1 to n do
begin
p := mod2(a-x-(i-1)*W, L+d);
if (not ((p > W-2*L-d) and (p <= W-L))) then
flag := false;
end;
if (flag) then
begin
write(x);
break;
end;
end;
end.
2
Download