QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 1024 MB Total points: 100 Difficulty: [show] Hackable ✓

#18988. Радужное дерево

Statistics

Согласно легенде, в Стране ночи растёт радужное дерево с $n$ вершинами. Это корневое дерево с вершинами, пронумерованными от $0$ до $n-1$. Его корень — вершина $0$, а родитель вершины $i$ ($1\le i<n$) — вершина $f_i$.

Каждая вершина радужного дерева может принимать любой цвет. Цветов бесконечно много, но пестрота дерева зависит только от количества различных цветов в каждом поддереве, а не от самих цветов. А именно, пусть в поддереве с корнем $i$ ($0\le i<n$) встречаются $c_i$ различных цветов. Тогда пестрота дерева задаётся последовательностью $[c_0,c_1,\ldots,c_{n-1}]$. Например, на рисунке ниже вершины $0,1,5$ синие, вершины $2,4$ красные, а вершина $3$ жёлтая; поэтому пестрота дерева равна $[3,2,1,2,1,1]$.

problem_18988_0defd7f4c6f581538d7838e13df5230a.png

Изменения облаков заставляют цвета радужного дерева подчиняться определённым закономерностям. Каждая закономерность описывается подмножеством вершин $S\subseteq\{1,2,\ldots,n-1\}$: цвет каждой вершины $u$ из $S$ совпадает с цветом некоторого её предка. Формально, для любого $u\in S$ существует предок $p$ вершины $u$ ($p\ne u$), имеющий тот же цвет, что и $u$. Даже при соблюдении закономерности дерево может иметь разные раскраски и разную пестроту. Обозначим через $w_S$ количество различных вариантов пестроты дерева, удовлетворяющих закономерности $S$. Два варианта пестроты различны тогда и только тогда, когда соответствующие последовательности различаются хотя бы в одном элементе.

Вычислите сумму количеств вариантов пестроты для всех $2^{n-1}$ возможных закономерностей, то есть $\sum_{S\subseteq\{1,2,\ldots,n-1\}}w_S$. Поскольку ответ может быть большим, выведите его по модулю $998244353$.

Детали реализации

Не нужно и не следует реализовывать функцию main.

Отправляемый исходный файл должен подключать заголовок rainbow.h. Добавьте в начало программы:

#include "rainbow.h"

В отправляемом исходном файле rainbow.cpp нужно реализовать функцию:

int rainbow(int c, int n, std::vector<int> f);
  • $c,n$ — соответственно номер теста и количество вершин радужного дерева. Значение $c=0$ означает пример.
  • $f$ — последовательность длины $n$, где $f_0=0$, а $f_i$ ($1\le i<n$) — родитель вершины $i$.
  • Функция должна вернуть сумму количеств вариантов пестроты радужного дерева, удовлетворяющих каждой закономерности, по модулю $998244353$.
  • В каждом тесте проверяющая программа вызовет эту функцию ровно один раз.

В каталоге задачи предоставлен пример кода template_rainbow.cpp. Можно использовать его при написании своего решения.

Проверка программы

В каталоге задачи можно скомпилировать исполняемый файл следующей командой:

g++ grader.cpp rainbow.cpp -o rainbow -O2 -std=c++14 -static

Полученный исполняемый файл rainbow работает следующим образом.

Он считывает со стандартного ввода данные следующего формата:

  • Первая строка содержит два неотрицательных целых числа $c,n$.
  • Вторая строка содержит $n-1$ неотрицательных целых чисел $f_1,f_2,\ldots,f_{n-1}$.

Он выводит в стандартный вывод данные следующего формата:

  • Одна строка с одним неотрицательным целым числом — результатом функции rainbow.

Примеры

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

0 3
0 0

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

8

Примечание

  • Закономерности $S=\varnothing$ удовлетворяют три варианта пестроты: $[1,1,1]$, $[2,1,1]$, $[3,1,1]$.
  • Закономерности $S=\{1\}$ удовлетворяют два варианта пестроты: $[1,1,1]$, $[2,1,1]$.
  • Закономерности $S=\{2\}$ удовлетворяют два варианта пестроты: $[1,1,1]$, $[2,1,1]$.
  • Закономерности $S=\{1,2\}$ удовлетворяет один вариант пестроты: $[1,1,1]$.

Поэтому ответ равен $3+2+2+1=8$.

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

0 6
0 1 0 3 1

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

279

Пример 3

См. файлы rainbow/rainbow3.in и rainbow/rainbow3.ans в каталоге участника.

Этот пример удовлетворяет ограничениям тестов $3,4$.

Пример 4

См. файлы rainbow/rainbow4.in и rainbow/rainbow4.ans в каталоге участника.

Этот пример удовлетворяет ограничениям тестов $5\sim7$.

Пример 5

См. файлы rainbow/rainbow5.in и rainbow/rainbow5.ans в каталоге участника.

Этот пример удовлетворяет ограничениям тестов $8,9$.

Пример 6

См. файлы rainbow/rainbow6.in и rainbow/rainbow6.ans в каталоге участника.

Этот пример удовлетворяет ограничениям тестов $10\sim12$.

Ограничения

Для всех тестовых данных выполняются условия:

  • $1\le n\le200$;
  • Для любого $1\le i<n$ выполняется $0\le f_i<i$.
Номера тестов $n\le$ Особое свойство
1 4 Нет
2 8
3,4 16
$5\sim7$ 50
8,9 $10^2$ B
$10\sim12$ Нет
$13\sim15$ 150
16 200 A
$17\sim19$ B
$20\sim25$ Нет

Особое свойство A: для любого $1\le i<n$ выполняется $f_i=i-1$.

Особое свойство B: для любого $0\le i<n$ существует не более двух значений $j$, удовлетворяющих $f_j=i$.

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download
#2220EditorialOpenqwqGotoHiotoriView
#2609EditorialOpen$O(n^2 \log^2 n)$ 题解 by ChatGPTAnonymousView

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.