其他分享
首页 > 其他分享> > P3244[HNOI2015]落忆枫音(计数dp + 组合数学 + DAG)

P3244[HNOI2015]落忆枫音(计数dp + 组合数学 + DAG)

作者:互联网

P3244 [HNOI2015]落忆枫音

题目传送门

题目大意 : 略

题目分析 :

代码:

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9 + 7;
const int M = 1e6 + 7;
int n , m , x , y;
vector<int> e[M];
int sum;
int deg[M];
int f[M];
int vis[M];
int Pow(int a , int b) {
	int ans = 1; 
	while(b) {
		if (b & 1) ans = ans * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return ans;
}
void dfs(int u) {
	if(vis[u]) return;
	vis[u] = 1;
	if(u == y) {f[u] = sum * Pow(deg[u] , mod - 2) % mod; return;}
	for(auto i : e[u]) {
		dfs(i);
		f[u] = (f[u] + f[i]) % mod;
	}
	f[u] = (f[u] * Pow(deg[u] , mod - 2) % mod ) % mod;
}
signed main () {
	ios::sync_with_stdio(0),cin.tie(0);
	cin >> n >> m >> x >> y;
	for(int i = 1; i <= m; ++ i) {
		int u , v; cin >> u >> v;
		e[v].push_back(u);
		deg[v] ++;	
	}
	deg[1] ++;
	int ans = 1; 
	sum = 1;
	for(int i = 1; i <= n; ++ i) {
		if(i == y) ans = ans * (deg[i] + 1) % mod;
		else ans = ans * deg[i] % mod;
		sum = sum * deg[i] % mod;
	}	
	dfs(x);
	cout << ((ans + mod - f[x]) % mod) ;
}	

[========]

本题完结!

标签:DAG,int,枫音,落忆,ans,mod,我们,deg
来源: https://www.cnblogs.com/Love-yx/p/16670779.html