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_dfa902da4e45a20012678b8f340f75f0.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$. מאחר שהתשובה עשויה להיות גדולה, נדרשת רק השארית מודולו $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

הסבר

  • עבור החוק $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.