Solution -「CF 1025G」Company Acquisitions
阿新 • • 發佈:2020-08-05
\(\mathcal{Description}\)
Link.
\(n\) 個公司,每個公司可能獨立或者附屬於另一個公司。初始時,每個公司附屬於 \(a_i\)(\(a_i=-1\) 表示該公司獨立)。不存在兩級及以上的附屬關係。每次事件隨機選取兩個獨立的公司,使其中一個公司所擁有的附屬公司全部獨立,並且該公司成為另一個公司的附屬。求使僅存在一個獨立公司的期望操作次數。對 \(10^9+7\) 取模。
\(n\le500\)。
\(\mathcal{Solution}\)
奇怪的解題姿勢增加了!
記一個公司的勢能函式 \(\phi(i)=2^{s_i}-1\),其中 \(s_i\)
\[\phi(S)=\sum_{i=1}^n\phi(i) \]
那麼,結束局面 \(T\) 的勢能函式 \(\phi(T)=2^{n-1}-1\)。
考慮單次事件對勢能的影響。對於局面 \(S\) 中一次作用在兩個獨立公司 \(u,v\) 上的事件,有:
\[\begin{align} E(\Delta\phi)&=E(\phi(S'))-\phi(S)\\ &=\frac{1}2((2^{s_u}-1)+(2^{s_v}-1))-(2^{s_u-1}-1)-(2^{2_v-1}-1)\\ &=-1+2\\ &=1 \end{align} \]
一次事件在期望意義下會讓局面的勢能 \(+1\)!所以期望事件個數就是勢能的期望變化次數。即:
\[\phi(T)-\phi(S) \]
其中 \(S\) 是初始局面,\(T\) 即上文結束局面。輸出這個值就好啦!
複雜度 \(\mathcal O(n)\)。
\(\mathcal{Code}\)
#include <cstdio> const int MAXN = 500, MOD = 1e9 + 7; int n, d[MAXN + 5]; inline int qkpow ( int a, int b, const int p = MOD ) { int ret = 1; for ( ; b; a = 1ll * a * a % p, b >>= 1 ) ret = 1ll * ret * ( b & 1 ? a : 1 ) % p; return ret; } int main () { scanf ( "%d", &n ); int ans = ( MOD + qkpow ( 2, n - 1 ) - 1 ) % MOD; for ( int i = 1, f; i <= n; ++ i ) { scanf ( "%d", &f ); if ( ~ f ) d[i] = -1, ++ d[f]; } for ( int i = 1; i <= n; ++ i ) { if ( ~ d[i] ) { ans = ( ans - qkpow ( 2, d[i] ) + 1 + MOD ) % MOD; } } printf ( "%d\n", ans ); return 0; }