2019牛客国庆集训派对day1 H.有向图(高斯消元)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019牛客国庆集训派对day1 H.有向图(高斯消元)相关的知识,希望对你有一定的参考价值。

LINK

定义 f [ i ] f[i] f[i]表示无穷久后,经过点 i i i的期望次数

f [ i ] = p v 1 − > i ∗ f [ v 1 ] + p v 2 − > i ∗ f [ v 2 ] . . . . . . f[i]=p_{v_1->i}*f[v_1]+p_{v_2->i}*f[v_2]...... f[i]=pv1>if[v1]+pv2>if[v2]......

特别的, 1 1 1号节点一开始就有一次,所以多加一, f [ 1 ] = . . . . . . . + 1 f[1]=.......+1 f[1]=.......+1

当然 v i v_i vi不能是终结点

高斯消元即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9+7;
int n,m,a[509][509],p[509][509];
int quick(int x,int n)
{
	x %= mod; int ans = 1;
	for( ; n ; n>>=1,x=x*x%mod )
		if( n&1 )	ans = ans*x%mod;
	return ans;
}
void guass(int n)
{
	for(int i=1;i<=n;i++)
	{
		int r = i;
		for(int j=i;j<=n;j++)
			if( a[j][i]!=0 )	r = j;
		if( i!=r )	swap( a[i],a[r] );
		int inv = quick( a[i][i],mod-2 );
		for(int j=i;j<=n+1;j++)	a[i][j] = a[i][j] * inv %mod;
		for(int j=1;j<=n;j++)
		{
			if( i==j )	continue;
			int div = a[j][i];
			for(int k=i;k<=n+1;k++)	a[j][k] = ( a[j][k]-div*a[i][k]%mod )%mod;
		}
	}
}
signed main()
{
	int inv = quick( 1ll*10000,mod-2 );
	while( cin >> n >> m )
	{
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n+m;j++)
		{
			cin >> p[i][j];
			p[i][j] = p[i][j]*inv%mod;
		}
		a[1][n+m+1] = 1;
		for(int i=1;i<=n+m;i++)
		{
			a[i][i] = 1;
			for(int j=1;j<=n;j++)	a[i][j] -= p[j][i];
		}
		guass( n+m );
		for(int i=n+1;i<=n+m;i++)	cout << (a[i][n+m+1]+mod)%mod << " ";
		cout << endl;
		
		for(int i=0;i<=n+m+1;i++)
		for(int j=0;j<=n+m+1;j++)
			a[i][j] = 0;
	}
} 

以上是关于2019牛客国庆集训派对day1 H.有向图(高斯消元)的主要内容,如果未能解决你的问题,请参考以下文章

2019牛客国庆集训派对day1 D.Modulo Nine(巧妙的dp)

2019牛客国庆集训派对day3 排列(状压dp)

2019牛客国庆集训派对day3 时间旅行(思维)

2019牛客国庆集训派对day3 J.买一送一(dfs+组合数学)

2019牛客国庆集训派对day2 C.Just h-index(主席树)

2019牛客国庆集训派对day2 J.Vertex Cover(思维,组合数学算贡献)