Universal Cup Judging System

Universal Cup

Limite de temps : 2.0 s Limite de mémoire : 1024 MB Points totaux : 100 Hackable ✓
Statistiques

Aby rozstrzygnąć, czy drzewa ukorzenione są izomorficzne (w tym zadaniu nie jest wymagana wcześniejsza wiedza o izomorfizmie drzew), często stosowanym algorytmem jest haszowanie drzew (tree hashing). Przy odpowiednio dobranej funkcji haszującej nieizomorficzne drzewa ukorzenione z dużym prawdopodobieństwem dają różne wartości hasza, choć kolizji haszy również trudno uniknąć.

Istnieją różne implementacje funkcji haszujących, jednak niektóre projekty takich funkcji nie są do końca poprawne. Mały C ma właśnie taką „nie do końca poprawną” funkcję haszującą, zdefiniowaną następująco: niech $sz_x$ oznacza liczbę wierzchołków zawartych w poddrzewie wierzchołka $x$, a $son_x$ niech będzie zbiorem wszystkich synów wierzchołka $x$. Dla drzewa ukorzenionego o korzeniu $r$ jego wartość hasza $h(r)$ definiujemy jako:

$$h(r) = 1 + \sum_{v \in son_r} h(v) \times f(sz_v)$$

gdzie $f$ oznacza dowolne przekształcenie ze zbioru dodatnich liczb całkowitych w zbiór dodatnich liczb całkowitych, tj. $f \in \{\varphi : \mathbb{Z}^+ \to \mathbb{Z}^+\}$. W szczególności wartość hasza dla drzewa ukorzenionego złożonego z tylko jednego wierzchołka wynosi $1$.

Następnie Mały C definiuje, że jeśli dla dwóch drzew ukorzenionych przy żadnym wyborze funkcji $f$ nie da się otrzymać różnych wartości hasza, to drzewa te nazywamy nierozróżnialnymi; w przeciwnym razie, jeśli istnieje taki wybór funkcji $f$, dla którego oba drzewa dają różne wartości hasza, to drzewa te nazywamy rozróżnialnymi.

Mały C chce użyć tej funkcji haszującej do wygenerowania jak największej liczby ukorzenionych drzew binarnych, czyli takich drzew ukorzenionych, w których każdy wierzchołek ma co najwyżej dwóch synów. Mały C liczy na to, że obliczysz maksymalną liczbę parami rozróżnialnych ukorzenionych drzew binarnych zawierających $n$ wierzchołków. Oczywiście odpowiedź może być bardzo duża, dlatego Mały C przygotował dla Ciebie modulo $p$ — wynik należy podać modulo $p$.

Wejście

To zadanie zawiera wiele przypadków testowych. Pierwszy wiersz wejścia zawiera liczbę całkowitą $T$ ($1 \le T \le 10000$), oznaczającą liczbę przypadków testowych.

Dla każdego przypadku testowego wejście składa się z pojedynczego wiersza zawierającego dwie liczby całkowite $n, p$ ($1 \le n \le 3000, 2 \le p \le 10^9 + 9$), oznaczające liczbę wierzchołków w drzewie ukorzenionym oraz modulo podane przez Małego C.

Gwarantowane jest, że łączna suma $n$ dla wszystkich przypadków testowych nie przekracza $10000$.

Wyjście

Dla każdego przypadku testowego wypisz pojedynczy wiersz z jedną liczbą całkowitą, oznaczającą wynik modulo $p$.

Przykład

Przykładowe wejście 1

8
1 1000000009
5 1000000009
10 1000000009
15 1000000009
100 1000000009
150 1000000009
1000 1000000009
1500 1000000009

Przykładowe wyjście 1

1
6
207
10904
478868953
202933416
152259136
264735211

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.