Вопрос Задача на питоне спасите пожалуйста!!!!!!!

Регистрация
8 Ноя 2013
Сообщения
88
Репутация
0
Спасибо
0
Монет
0
Алиса решила поздравить своего друга с началом нового учебного года. Впереди холодная осень, поэтому она решила связать для него собственными руками шарф.



Незаметно для друга Алиса узнала, что ему большего всего нравятся k различных цветов. Алиса приняла решение связать шарф размером n × m, в котором будут чередоваться полоски различных цветов. Её друг никогда не ищет легких путей, поэтому она решила, что шарф с горизонтальными или вертикальными полосками покажется ему слишком «примитивным». Алиса решила, что полоски определённо должны быть диагональными!



Закончив вязать шарф, Алиса вспомнила, что один из k цветов её друг считает особенным! Это цвет c, который по его мнению приносит школьникам удачу на олимпиадах по информатике. И Алисе стало невероятно интересно, сколько фрагментов шарфа имеют именно такой цвет. Шарф получился очень большим, Алиса очень устала, пока его вязала, поэтому сама она уже не может ответить на этот вопрос и просит вас о помощи...



Более формально шарф можно представить в виде таблицы размером n × m, каждая клетка которой покрашена в один из k цветов. Цвета нумеруются от 1 до k.



Первая строка таблицы покрашена в цвета 1, 2, ..., k, 1, 2, ..., k и т.д. Каждая следующая строка получена из предыдущей сдвигом влево на одну клетку. Таким образом, таблица состоит из диагональных полос.



При n = 4, m = 8 и k = 3 таблица будет иметь следующий вид:





306580869_2d526e8d8550dd298cc4edf3d0791a84_800.png

По данным числам n, m, k и c определите, сколько всего клеток покрашено в цвет c.



Входные данные

Первая строка входных данных содержит натуральное число n — ширину шарфа.



Вторая строка входных данных содержит натуральное число m — длину шарфа.



Третья строка входных данных содержит натуральное число k — количество любимых цветов друга Алисы.



Числа n, m и k не превосходят 109.



Четвёртая строка входных данных содержит натуральное число c — номер особенного цвета (1 ≤ c ≤ k).



Выходные данные

Программа должна вывести одно целое число — количество клеток шарфа, которые покрашены в цвет c.



Примечание:

Обратите внимание, что ответ в этой задаче может превышать возможное значение 32-битной целочисленной переменной, поэтому необходимо использовать 64-битные целочисленные типы данных (тип int64 в языке Pascal, тип long long в C++, тип long в Java и C#).







Система оценки



Решения, правильно работающие, когда число n не превосходит 10, будут оцениваться в 16 баллов.



Решения, правильно работающие, когда одно из чисел n или m делится нацело на k, будут оцениваться в 16 баллов.



Решения, правильно работающие, когда числа n и m не превосходят 800, будут оцениваться в 40 баллов.



Решения, правильно работающие, когда числа n и m не превосходят 105, будут оцениваться в 60 баллов.







Замечание



Картинка соответствует примеру из условия. Шарф имеет размеры 4 × 8 и состоит из клеток трёх цветов. В цвет 1 покрашены 11 клеток.



Пример:

Входные данные

4

8

3

1

Выходные данные

11



Ограничения: Время выполнения: < 1000 ms Выделяемая память 256 mb
 
Давайте решим эту задачу. После чтения данных, можно заметить, что диагональные полосы, создаваемые одним цветом, будут периодически повторяться каждые k строк. Таким образом, мы можем рассчитать, сколько раз каждый цвет появляется в первых k строках, и затем применить этот результат ко всему шарфу.

Алгоритм:
1. Заведите массив `color_counts` размера k, чтобы подсчитать, сколько раз каждый цвет появляется в первых k строках.
2. Пройдите по первым k строкам и увеличивайте счетчик для каждого цвета в `color_counts`.
3. Умножьте значение для цвета c в `color_counts` на `(n // k)` (целочисленное деление). Это дает нам количество вхождений цвета c в большую часть шарфа.
4. Добавьте количество вхождений цвета c для оставшихся строк `(n % k)`.
5. Выведите результат.

Код на Python:

```python
n = int(input())
m = int(input())
k = int(input())
c = int(input())

color_counts = [0] * k
for i in range(k):
for j in range(m):
color = (i + j) % k + 1
color_counts[color-1] += 1

result = color_counts[c-1] * (n // k)
for i in range(n % k):
for j in range(m):
color = (i + j) % k + 1
if color == c:
result += 1

print(result)
```

Этот код решает проблему эффективно и соответствует всем ограничениям, указанным в задаче.
 
Если не углубляться в алгоритмику, то ...
1909512_70f365f09db8ebd6e54fc5a7f43fa413_800.png

 
299068460_eae226e807aee67969cc9b8539a565cf_800.jpg

Взято из Сириус гпт
 
Ответы на всю олимпиаду в tg@olimpiadavsosh
 
Назад
Сверху