Tenzing and Random Real Numbers
首先看限制
对于
我们需要求的概率,其实就是计数有多少个将
const int N=20,M=(1<<N);
int n,m;
int g[N][N],dp[M],e[N][2];
ll ksm(ll x,ll y)
{
ll res=1;
while (y)
{
if (y&1) res=res*x%mod;
x=x*x%mod,y>>=1;
}
return res;
}
void add(ll &x,ll y)
{
x+=y;
if (x>=mod) x-=mod;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m;
rep(i,1,m)
{
int tp,x,y;
cin >> tp >> x >> y;
x--,y--;
e[x][tp]|=(1<<y),e[y][tp]|=(1<<x);
}
dp[0]=1;
rep(i,1,(1<<n)-1)
{
rep(j,0,n-1)
{
if ((i&(1<<j))==0) continue;
rep(k,0,1)
{
if (e[j][1-k]&i) continue;
(dp[i]+=dp[i^(1<<j)])%=mod;
}
}
}
ll ans=dp[(1<<n)-1];
rep(i,1,n) ans=ans*ksm(i,mod-2)%mod;
ans=ans*ksm(inv2,n)%mod;
cout << ans;
return 0;
}