c++ У Анастасии есть целое положительное число, де...
Created on: December 7, 2025
Answered using GPT-5.1 Thinking by Chat01
Created on: December 7, 2025
Answered using GPT-5.1 Thinking by Chat01
c++ У Анастасии есть целое положительное число, десятичная запись которого не содержит нулей.
Борис хочет сделать Анастасии сюрприз и поставить ровно один знак + или * между какими-то двумя цифрами числа так, чтобы значение полученного выражения было чётным.
Сколькими способами он это может сделать? Два способа считаются разными, если используется разный знак, а также если знак стоит в разных позициях.
Формат входных данных
Первая строка входных данных содержит одно целое число
n
(
1
≤
n
<
10
10
000
).
Формат выходных данных
Выведите одно целое число — количество способов сделать число Анастасии чётным с помощью указанного в задаче действия.
Система оценки
Задача состоит из четырёх подзадач.
В первой подзадаче
n
<
10
18
. Эта подзадача оценивается в 15 баллов.
Во второй подзадаче
n
<
10
100
. Эта подзадача оценивается в 34 балла.
В третьей подзадаче все цифры числа — единицы. Эта подзадача оценивается в 8 баллов.
В четвёртой подзадаче дополнительных ограничений нет. Эта подзадача оценивается в 43 балла.
Решается это довольно коротко 😊
Пусть число — это строка цифр
, где — количество цифр.
Мы ставим одну операцию + или * между цифрами и . Тогда выражение выглядит так:
где:
Нас интересует, когда или чётно.
Чётность любого числа в десятичной системе полностью определяется последней цифрой.
То есть:
Значит, для позиции разреза :
Обозначим:
Теперь рассмотрим два случая.
Пусть (последняя цифра чётная).
Для каждой позиции (от 1 до ):
+ даёт чётное число, если (т.е. цифра чётная).* всегда даёт чётное число, потому что уже чётное.Обозначим:
evenCnt — количество чётных цифр среди .Тогда:
+ = evenCnt,* = (по одной позиции на каждый разрез).Итого:
Пусть (последняя цифра нечётная).
Для каждой позиции :
+ чётное ⇔ (т.е. цифра нечётная),* чётное ⇔ (т.е. цифра чётная), так как нечётно.Т.е. для каждого разреза ровно одна из двух операций делает результат чётным.
Всего разрезов , значит:
(независимо от самих цифр, важна только нечётность последней).
Пусть:
L = s.size(),lastEven = (последняя цифра чётная?),evenCnt = количество чётных цифр среди первых L-1 цифр.Тогда:
lastEven == true → answer = evenCnt + (L - 1),answer = L - 1.Число цифр максимум 10 000, ответ ≤ 2·(L−1) < 20 000 — отлично помещается в int или long long.
cpp#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); string s; if (!(cin >> s)) return 0; int L = (int)s.size(); if (L == 1) { // Нет места, куда ставить знак cout << 0 << '\n'; return 0; } bool lastEven = ((s.back() - '0') % 2 == 0); int evenCnt = 0; for (int i = 0; i < L - 1; ++i) { int d = s[i] - '0'; if (d % 2 == 0) ++evenCnt; } long long ans; if (lastEven) { ans = evenCnt + (L - 1); } else { ans = (L - 1); } cout << ans << '\n'; return 0; }
Если хочешь, могу ещё приписать несколько маленьких тестов для самопроверки.