本题难度较大,需要前置知识强连通分量。
对于每条规则 (a,b),若激活 b 则必须激活 a,我们让 b 连一条有向边到 a,表示 a 是 b 的前置符文,此时可以构成一个有向图。
然而可能出现循环依赖的情况,即成环。对于成环的情况,若激活环上任意一个符文,则环上其它符文都必须激活,因此我们可以将这样的强连通分量缩点为一个符文。
缩点需要采用强连通分量的tarjan算法,可以将环缩成一个点。
在一个古老的符文法阵中,有 n 个基础符文,编号为 1 到 n。某些符文之间存在连锁效应:若激活符文 b,则符文 a 也必须同时激活,否则能量会失衡。
现在给出了 m 条这样的连锁规则,每条规则由两个整数 a,b 描述,表示“若激活 b,则必须激活 a”。已知在所有规则中,每个 a 最多出现一次,即每个符文至多被一个规则强制要求激活。
你希望选择一些符文激活(至少激活一个符文),使得所有规则都得到满足。请问一共有多少种不同的合法激活方案?由于答案可能很大,请输出其对 109+7 取模的结果。
数据范围:符文数量 n 和规则数量 m 满足 1≤n,m≤105;编号 a,b 满足 1≤a,b≤n;保证每个 a 在所有规则中至多出现一次。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.