
- •Содержание
- •В ожидании Нового года Условие
- •Золотые яйца Условие
- •Отгадай слово Условие
- •Формат входного файла
- •Формат выходного файла
- •Ограничения
- •Примеры тестов
- •Инкубатор Бабы Яги Условие
- •Расписные салфеточки Условие
- •Сколько прошло дней? Условие
- •Арифметическая прогрессия Условие
- •Нарезка фантиков Условие
- •Шагающий циркуль Условие
- •Волшебные горшочки Бабы Яги Условие
- •Стиральный вопрос
- •Чудик в Цветландии Условие
- •Столовая Условие
- •Рейтинг студента Условие
- •Формат входного файла
- •Формат выходного файла
- •Ограничения
- •Примеры тестов
- •Лена и зеркало
- •Макет города Условие
- •Мосты-горки Условие
Расписные салфеточки Условие
У Марфы Геннадьевны имеется кусок очень красивой атласной ткани с выбитыми цветами. Длина куска ткани — 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 + (N − 1)a, то решение найдено. Если L < b + (N − 1)a, то можно заменить длину одной части c b на x, где x = L − (N − 1)a. При этом гарантированно a ≤ x ≤ b. Если L > b + (N − 1)a, то заменим длину ещё одной части на b. И так далее.
Алгоритм выглядит следующим образом. Найдём минимальное i, для которого ib + (N − i)a ≥ L. Тогда длины (i − 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 не високосные, то количество дней между этими датами равно 365n + x, где x — количество високосных годов среди годов y1 + 1, …, y2 – 1. Если среди годов y1 и y2 один високосный, а другой не високосный, то количество дней между данными датами может быть равно 365n + x или 365n + x + 1. Если годы y1 и y2 оба високосные, то количество дней между данными датами равно 365n + x + 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.