2019牛客国庆集训派对day1 H.有向图(高斯消元)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019牛客国庆集训派对day1 H.有向图(高斯消元)相关的知识,希望对你有一定的参考价值。
定义 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−>i∗f[v1]+pv2−>i∗f[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 J.买一送一(dfs+组合数学)