又是數學亂搞

開心,zkx 打算畫一束花送給cc。
可問題是zkx 發現他並不會畫花,但機智的他卻發現只要先畫一棵五顏六色的樹,再把它翻轉180 度就
是一株漂亮的花了!zkx 決定用p 種顏色花這棵樹。
但是一個節點一個節點畫太慢了,於是zkx 決定執行如下q 次操作:
1: 選取某種顏色,爲c,並且選定一個數字k
2: 將每個顏色爲c 的葉子節點下面從左向右依次接上顏色爲a1; a2; ::; ak 的k 個節點(保證顏色爲c 的
節點一定存在)
初始時zkx 有一個顏色爲1 的節點。經過k 操作,zkx 就有了一棵很大的樹。
我們先序遍歷這棵樹,並且無視所有非葉節點。設得到的葉子節點顏色序列爲v0; v2; ::; vm 那麼這棵樹
的美麗度爲
value =
Σm
i=0
vi li
其中l 爲cc 喜歡的一個數。
現在zkx 想知道,這棵樹的美麗值對於998244353 取模的結果。
1.2 輸入格式
第一行三個整數p; q 和l。
接下來的q 行,每行給出k 和顏色c, 以及接在顏色c 下的從左向右依次k 個點,a1; a2; ::; ak
結合樣例食用更佳。
1.3 輸出格式
一個整數,表示value 對於998244353 取模的結果
1.4 樣例輸入
4 3 2
3 1 1 2 3
3 2 1 1 4
1 1 4
2
1.5 樣例輸出
108
1.6 樣例解釋
最後獲得了圖的一棵樹
最後的到的v 序列爲4; 4; 4; 4; 3
1.7 數據範圍
對於40% 的數據
1 p; q 10; 1 l 10, 且1
Σ
k 100
對於100% 的數據
1 p; q 105; 1 l 108
保證每個詢問中1 c; ai p, 且1 Σ

k 106

#include <bits/stdc++.h>
#define N 400100
#define M 2001000
#define MOD 998244353
using namespace std;
int n, m, l;
int ci[N], fs[N];
int bi[M], tl;
int powi(int a, int b)
{
    int c = 1;
    for (; b; b /= 2, a = 1ll * a * a % MOD)
        if (b & 1) c = 1ll * c * a % MOD;
    return c;
}
int li[N], di[N];
int main()
{
    scanf("%d%d%d", &n, &m, &l);
    for (int i = 1; i <= m; ++ i)
    {
        int k;
        fs[i] = tl;
        scanf("%d%d", &k, &ci[i]);
        for (int j = 1; j <= k; ++ j)
        {
            int a;
            scanf("%d", &a);
            bi[tl ++] = a;
        }
    }
    fs[m + 1] = tl;
    for (int i = 1; i <= n; ++ i) li[i] = 1, di[i] = i;
    for (int i = m; i >= 1; -- i)
    {
        int nl = 0, nd = 0;
        for (int j = fs[i]; j < fs[i + 1]; ++ j)
        {
            nd = (1ll * powi(l, nl) * di[bi[j]] + nd) % MOD;
            nl = (nl + li[bi[j]]) % (MOD - 1);
        }
        li[ci[i]] = nl;
        di[ci[i]] = nd;
    }
    printf("%d", di[1]);
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章