ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【题解】 [Cnoi2020]线形生物 期望dp

2020-09-19 18:31:58  阅读:308  来源: 互联网

标签:le int 题解 long Cnoi2020 read MX dp getchar


Legend

给定 \(1\to 2 \to \cdots \to n \to n+1\) 的边和 \(m\) 条往回走的有向边,长度都是 \(1\)。站在一个点时等概率选择一条出边,求 \(1\to n+1\) 期望长度。

\(1 \le n ,m \le 10^6\)。

Editorial

考虑一个套路:设 \(f_{i}\) 表示从 \(i\to i+1\) 行走距离的期望,答案就是 \(\sum\limits_{i=1}^n f_i\)。

这个东西也很好求……

Code

#include <bits/stdc++.h>

#define LL long long

int read(){
	char k = getchar(); int x = 0;
	while(k < '0' || k > '9') k = getchar();
	while(k >= '0' && k <= '9') x = x * 10 + k - '0' ,k = getchar();
	return x;
}

const LL MOD = 998244353;
LL qpow(LL a ,LL b ,LL p = MOD){
	LL Ans = 1;
	while(b){if(b & 1) Ans = Ans * a % p;
		a = a * a % p ,b >>= 1;
	}return Ans;
}

const int MX = 1e6 + 233;
LL dp[MX] ,zh[MX] ,qzh[MX];
int n ,m;
std::vector<int> fz[MX];

int main(){
	read();
	n = read() ,m = read();
	for(int i = 1 ,u ,v ; i <= m ; ++i){
		u = read() ,v = read();
		if(u != v)	fz[u].push_back(v);
		else zh[u]++;
	}
	LL Ans = 0;
	for(int i = 1 ; i <= n ; ++i){
		int ch = fz[i].size() + 1 + zh[i];
		LL inv = qpow(ch ,MOD - 2);
		dp[i] = 1;
		for(auto j : fz[i]){
			dp[i] = (dp[i] + inv * (qzh[i - 1] - qzh[j - 1] + MOD)) % MOD;
		}
		dp[i] = dp[i] * ch % MOD;
		// printf("f[%d] = %lld\n" ,i ,dp[i]);
		Ans = (Ans + dp[i]) % MOD;
		qzh[i] = (qzh[i - 1] + dp[i]) % MOD;
	}
	using namespace std;
	cout << Ans << endl;
	return 0;
}

标签:le,int,题解,long,Cnoi2020,read,MX,dp,getchar
来源: https://www.cnblogs.com/imakf/p/13697150.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有