「KFCOI Round #1」回首
这一次,我还赌你赢。
这里是出题人的题解。
题目大意
给定一张
一共进行
每个节点的权值一开始都会乘上
题目解析
对于 40\% 的数据:
直接模拟即可,没有任何难度,注意取模的问题,注意这些操作的先后问题。
对于 100\% 的数据:
注意到
但是,由于每一次图的形态不会改变,并且每一次每一个点会从哪些点加来权值是固定的。
所以考虑一个并不难的矩阵快速幂。
先预处理出每次操作前的转移矩阵,如下:
接下来,如果
如果点
最后直接做矩阵快速幂即可。
代码如下:
read (n, m, T);
for (i32 i = 1; i <= n; i++)
read (Base.mat[i][i]);
for (i32 i = 1; i <= m; i++){
i64 x, y; read (x, y);
G[x].push_back (y);
}
for (i32 i = 1; i <= n; i++) {
for (auto it : G[i])
in[it]++, Base.mat[i][it] = 1;
}
for (i32 i = 1; i <= n; i++)
if (!in[i])
Base.mat[n + 1][i] = Base.mat[n + 2][i] = 1;
Base.mat[n + 1][n + 1] = Base.mat[n + 2][n + 1] = 1;
Base.mat[n + 2][n + 2] = 1;
F.mat[1][n + 2] = 1;
F = fpow (F, Base, T);
for (i32 i = 1; i <= n; i++)
print (F.mat[1][i]), putchar (' ');