Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Часть сборника.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
488.45 Кб
Скачать

Расписные салфеточки Условие

У Марфы Геннадьевны имеется кусок очень красивой атласной ткани с выбитыми цветами. Длина куска ткани — L см, ширина — 0,5 м. Марфа Геннадьевна — очень большая рукодельница и любит делать всякие поделки. И вот из этого куска ткани она надумала сделать несколько салфеточек и подарить их на праздник своим подружкам.

Марфа Геннадьевна хочет разрезать этот кусок ткани ровно на N частей. При этом длина каждой части l должна быть целой и должно выполняться неравенство a  l  b (чтобы салфетки были не слишком маленькими и не слишком большими).

Напишите программу, позволяющую определить, можно ли разрезать кусок ткани ровно на N таких частей.

Формат входного файла

Входной файл содержит целые числа N L a b.

Формат выходного файла

Требуется вывести в выходной файл N целых чисел li, если задача имеет решение, и единственное число 0, если задача не имеет решения.

Ограничения

1  N  100

1  L  1000

1  a  b  1000

Примеры тестов

Входной файл

Выходной файл

1

3 5 1 2

1 2 2

2

3 7 1 2

0

Разбор

Если решение задачи существует, то выполняются неравенства a  li  b, i = 1, 2, ..., N. При этом l1 + l2 + ... + lN = L. Складывая эти неравенства, получим следующее неравенство: Na  L  Nb. Таким образом, для того чтобы решение существовало, необходимо, чтобы выполнялось данное неравенство. Если данное неравенство не выполняется, то решения нет.

Предположим, что данное неравенство выполняется. Покажем, что в этом случае решение всегда есть.

Пусть длины всех N частей изначально равны a. Если L = Na, то решение найдено. Если L > Na, то заменим длину одной части на b. Если L = b + (− 1)a, то решение найдено. Если L < b + (− 1)a, то можно заменить длину одной части c b на x, где x = L − (− 1)a. При этом гарантированно a  x  b. Если L > b + (− 1)a, то заменим длину ещё одной части на b. И так далее.

Алгоритм выглядит следующим образом. Найдём минимальное i, для которого ib + (− i)a  L. Тогда длины (− 1) частей возьмём равными b, длины (N − i) частей возьмём равными a, а длину оставшейся одной части возьмём равной x = L − (N − i)a − (i − 1)b. При этом гарантированно a  x  b.

program napkins;

var

n, l, a, b: integer;

i, ii: integer;

begin

assign(input, 'input.txt');

reset(input);

assign(output, 'output.txt');

rewrite(output);

read(n, l, a, b);

if ((n*a <= l) and (l <= n*b)) then

begin

for i := 1 to n do

begin

if (i*b + (n-i)*a >= l) then

begin

ii := i;

break;

end;

end;

for i := 1 to ii-1 do

write(b, ' ');

write(l-(n-ii)*a-(ii-1)*b, ' ');

for i := ii+1 to n do

write(a, ' ');

end

else

write(0);

close(input);

close(output);

end.

Сколько прошло дней? Условие

Был день d.m.y1.

Прошло ровно N лет, и наступил день d.m.y2, где y2 = y1 + N.

Здесь d — число месяца, m — месяц, yi — год. Обратите внимание, что в датах d.m.y1 и d.m.y2 дни и месяцы соответственно равны, даты отличаются только годами.

Сколько прошло дней?

Примечание. В обычном году 365 дней, в високосном — 366. В феврале обычного года 28 дней, в феврале високосного 29 дней. Год Y високосный, если Y делится на 4, но не делится на 100. Если Y делится на 100, но не делится на 400, то год не високосный. Если Y делится на 400, то год високосный.

Например, 2009 год не високосный (2009 не делится на 4), 2008 — високосный (2008 делится на 4), 2000 — високосный (2000 делится на 400), 1900 — не високосный (1900 делится на 100, но не делится на 400).

Формат входного файла

Входной файл содержит единственное целое число N.

Формат выходного файла

Требуется вывести все возможные количества дней в порядке возрастания.

Ограничения

1  N  100000

Примеры тестов

Входной файл

Выходной файл

1

1

365 366

Разбор

Задача решается методом перебора.

Заметим, что количество дней между датами d.m.y1 и d.m.y2 повторяется каждые 400 лет. Поэтому достаточно перебрать y1 в диапазоне 1…400.

Пусть выбрано значение y1. Вычислим возможные количества дней между датами d.m.y1 и d.m.y2. Если годы y1 и y2 не високосные, то количество дней между этими датами равно 365x, где x — количество високосных годов среди годов y1 + 1, …, y2 – 1. Если среди годов y1 и y2 один високосный, а другой не високосный, то количество дней между данными датами может быть равно 365x или 365n + x + 1. Если годы y1 и y2 оба високосные, то количество дней между данными датами равно 365x + 1.

program days;

var

n: longint;

min_num, max_num: longint;

x: longint;

y1, y2: longint;

i: longint;

function is_leap(x: longint): boolean;

begin

is_leap := (x mod 400 = 0) or

(x mod 4 = 0) and (x mod 100 <> 0);

end;

procedure check_num(num: longint);

begin

if (num < min_num) then

min_num := num;

if (num > max_num) then

max_num := num;

end;

procedure check(y1, y2, x: longint);

begin

if is_leap(y1) or is_leap(y2) then

check_num(365*n+x+1);

if not is_leap(y1) or not is_leap(y2) then

check_num(365*n+x);

end;

begin

assign(input, 'input.txt');

reset(input);

assign(output, 'output.txt');

rewrite(output);

read(n);

min_num := MaxLongInt;

max_num := 0;

y1 := 1;

y2 := y1+n;

x := 0;

for i := y1+1 to y2-1 do

begin

if is_leap(i) then

inc(x);

end;

check(y1, y2, x);

for y1 := 2 to 400 do

begin

y2 := y1+n;

x := x + ord(is_leap(y2-1)) - ord(is_leap(y1));

check(y1, y2, x);

end;

for i := min_num to max_num do

write(i, ' ');

close(input);

close(output);

end.