QOJ.ac

QOJ

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

#18988. Веселкове дерево

Statistics

За легендою, у Країні ночі є веселкове дерево з $n$ вершинами. Веселкове дерево — кореневе дерево, вершини якого пронумеровані $0\sim 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_c16f688fc26a1da789a5de6cf4ac98a4.png

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

Обчисліть суму кількостей різних барвистостей дерева, що задовольняє кожну з усіх можливих $2^{n-1}$ закономірностей, тобто $\sum_{S\subseteq\{1,2,\ldots,n-1\}}w_S$. Оскільки відповідь може бути великою, достатньо знайти її остачу від ділення на $998\,244\,353$.

Деталі реалізації

Ви не повинні й не маєте потреби реалізовувати функцію 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$.
  • Функція має повернути остачу від ділення на $998\,244\,353$ суми кількостей різних барвистостей веселкового дерева, що задовольняє кожну закономірність.
  • Для кожного тесту перевіряльна програма викличе цю функцію рівно один раз.

Файл 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

Пояснення до прикладу 1

  • Для закономірності $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.