云南响应式网站建设,wordpress到服务器配置,wordpress会员发布文章,互联网行业数据分析正题
题目链接:https://www.luogu.com.cn/problem/CF1556F 题目大意 nnn个点的一张竞赛图#xff0c;每个点有一个权值aia_iai#xff0c;(i,j)(i,j)(i,j)之间的边iii连jjj的概率是aiaiaj\frac{a_i}{a_ia_j}aiajai#xff0c;否则jjj连iii。
现在期望有多少个点…正题
题目链接:https://www.luogu.com.cn/problem/CF1556F 题目大意
nnn个点的一张竞赛图每个点有一个权值aia_iai(i,j)(i,j)(i,j)之间的边iii连jjj的概率是aiaiaj\frac{a_i}{a_ia_j}aiajai否则jjj连iii。
现在期望有多少个点能走到全图的任意一个点。
1≤n≤14,1≤ai≤1061\leq n\leq 14,1\leq a_i\leq 10^61≤n≤14,1≤ai≤106 解题思路
考虑状压dpdpdp首先枚举起点ppp设fSf_{S}fS表示目前只考虑了点集SSS且ppp都能到达。
那么对于点集SSS是任意一张图的概率是111然后考虑枚举一个ppp能到达的集合TTT之后其他点ppp都不能到达为了方便表示下面记gS,Tg_{S,T}gS,T表示点集SSS和TTT之间的边都是SSS指向TTT的概率那么有 1∑T⊆SfT×gS−T,T1\sum_{T\subseteq S}f_T\times g_{S-T,T}1T⊆S∑fT×gS−T,T ⇒fS1−∑T⊂SfT×gS−T,T\Rightarrow f_S1-\sum_{T\subset S}f_T\times g_{S-T,T}⇒fS1−T⊂S∑fT×gS−T,T
考虑如何预处理gS,Tg_{S,T}gS,T不难发现因为S∩T∅S\cap T\varnothingS∩T∅所以这个状态数是3n3^n3n的我们可以用三进制状压不过得先预处理rp,Sr_{p,S}rp,S表示ppp与集合SSS之间的边都是ppp连向SSS的概率。
时间复杂度O(3nn2nn2)O(3^nn2^nn^2)O(3nn2nn2) code
#includecstdio
#includecstring
#includealgorithm
#define ll long long
using namespace std;
const ll N14,M2e610,P1e97;
ll n,ans,inv[M],pw[N1],a[N],r[N][1N],tr[1N],f[1N],g[4782969];
signed main()
{inv[1]1;for(ll i2;iM;i)inv[i]P-(P/i)*inv[P%i]%P;scanf(%lld,n);for(ll i0;in;i)scanf(%lld,a[i]);ll MS(1n);for(ll p0;pn;p){r[p][0]1;for(ll s0;sMS;s){if((sp)1)continue;for(ll i0;in;i)if((si)1){r[p][s]r[p][s^(1i)]*a[p]%P*inv[a[p]a[i]]%P;break;}}}pw[0]1;for(ll i1;in;i)pw[i]pw[i-1]*3;for(ll s1;sMS;s)for(ll i0;in;i)if((si)1)tr[s]tr[s^(1i)]pw[i];for(ll s0;spw[n];s)g[s]1;for(ll s0;sMS;s)for(ll i0;in;i){if(!((si)1))continue;for(ll ts;t;t(t-1)s){if((ti)1)continue;(g[tr[s]tr[t]]*r[i][t])%P;}}for(ll p0;pn;p){memset(f,0,sizeof(f));for(ll s0;sMS;s){if(!((sp)1))continue;f[s]1;for(ll t(s-1)s;t;t(t-1)s){if(!((tp)1))continue;(f[s]P-f[t]*g[tr[s]tr[t]]%P)%P;}}(ansf[MS-1])%P;}printf(%lld\n,ans);return 0;
}