题目链接
一.题目内容
给一个有向无环图,求 图中每个点到每个点的路径条数 * 起点的a值 * 终点的b值,结果模1e9+7
样例解释
样例一:
1到2,一条路径,1a1b2=1,1到3,两条路径,2a1b3=2,2到3,一条路径,1a2b3=1,结果为4
二.解题思路
最开始的起点肯定是入度为零的点,从它们开始深搜。
若儿子为叶子节点,则直接等于一条新路径,如下图 k1/k2/k3为叶子,则sumj的值为aj * (bk1,bk2…)
而 i 为 j 的父亲, 所以 j 所能到达的点 i 也能到达,并且路径数是相同的,路径为 i->j->xxx,所以 i 对这些点的值等于 j 对它们的值 / aj 再 * ai,并且 i->j 也是一条新路径,所以还要加上 i 对 j 的值 ai * bj。
因为要对1e9+7取模,所以 / aj 这一步可用费马小定理 * aj的逆元即可。
因为可能有多次搜索,所以用一个数组存点对它所能到达的点的值,实现记忆化搜索,不然肯定会超时。
三.解题代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define rrep(i,l,r) for(int i=l;i>=r;