[期望 状压DP 子集DP 多项式] BZOJ 3925 [Zjoi2015]地震后的幻想乡
2017-01-11 15:02
429 查看
Po姐说的肯定比我清楚多
http://blog.csdn.net/popoqqq/article/details/44858691
http://blog.csdn.net/popoqqq/article/details/44858691
#include<cstdio> #include<cstdlib> #include<algorithm> #include<vector> using namespace std; typedef long long ll; typedef __float128 ld; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++; } inline void read(int &x){ char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } struct Poly{ int n; vector<ll> a; Poly(){ } Poly(int in){ if (in>=0) { n=in; a.resize(n+1); for (int i=0;i<=n;i++) a[i]=0; } if (in==-1) n=0,a.resize(1),a[0]=1; } ll &operator [](int x){ return a[x]; } friend Poly operator + (const Poly &A,const Poly &B){ Poly ret=Poly(max(A.n,B.n)); for (int i=0;i<=A.n;i++) ret[i]+=A.a[i]; for (int i=0;i<=B.n;i++) ret[i]+=B.a[i]; return ret; } friend Poly operator - (const Poly &A,const Poly &B){ Poly ret=Poly(max(A.n,B.n)); for (int i=0;i<=A.n;i++) ret[i]+=A.a[i]; for (int i=0;i<=B.n;i++) ret[i]-=B.a[i]; return ret; } friend Poly operator * (const Poly &A,const Poly &B){ Poly ret=Poly(A.n+B.n); for (int i=0;i<=A.n;i++) for (int j=0;j<=B.n;j++) ret[i+j]+=A.a[i]*B.a[j]; return ret; } }; const int N=15; int n,m,a ; Poly pow[N*N],f[1<<10],Ans; int cnt[1<<10],bin[1<<10]; #define low(x) (bin[(x)&-(x)]) int main(){ int iu,iv; freopen("mst.in","r",stdin); freopen("mst.out","w",stdout); read(n); read(m); for (int i=1;i<(1<<n);i++) cnt[i]=cnt[i^(i&-i)]+1; for (int i=1;i<=n;i++) bin[1<<(i-1)]=i; for (int i=1;i<=m;i++) read(iu),read(iv),a[iu]+=1<<(iv-1),a[iv]+=1<<(iu-1); pow[0]=Poly(-1); pow[1]=Poly(1),pow[1][0]=1,pow[1][1]=-1; for (int i=2;i<=m;i++) pow[i]=pow[i-1]*pow[1]; for (int i=1;i<(1<<n);i++){ f[i]=Poly(-1); int rest=i^(1<<(low(i)-1)); for (int j=rest;j;(--j)&=rest){ int cot=0; for (int t=i^j;t;t-=t&-t) cot+=cnt[a[low(t)]&j]; f[i]=f[i]-f[i^j]*pow[cot]; } } Ans=Poly(-1)-f[(1<<n)-1]; ld ans=0; for (int i=0;i<=Ans.n;i++) ans+=(ld)Ans[i]/(i+1); printf("%.6lf\n",(double)ans); return 0; }
相关文章推荐
- 20170110L05-03老男孩linux实战运维培训-nfs网络文件系统服务介绍与实战01
- java 链表
- jni层数据类型映射
- 重新比较3个模型预测大盘准确率
- spring boot 、springMVC环境集成百度ueditor富文本编辑器,使用七牛云存储图片
- Markdown 入门
- assert()函数用法总结
- 对象的深复制方法(对象流实现)
- Iterator的使用
- iOS 时间校准解决方案
- 微信小程序-上海站
- 关闭支付宝小额免密支付步骤详解
- AndroidMainfest.xml详解——<supports-gl-texture>
- makefile多级目录编译
- C#网络编程——第二篇 HTTP应用编程(上)
- input子系统学习笔记
- 【牛客网】网易2017内推笔试编程题合集(二)
- UEditor 第一次加载正常,第二次无法正常加载问题
- jboss-as-7.1.1.Final与jdk1.8不兼容解决方案
- DDD领域模型和持久模型的实施方式(不定期更新ing)