[BZOJ2337][HNOI2011]XOR和路径(期望概率dp+高斯消元)
2018-03-04 15:05
459 查看
一个日常的学术讨论
Q:投掷一个硬币 出正反面的概率相等 问期望投掷几次后连续出两个反面
A:设f[0],f[1],f[2]为从 0、1、2状态开始,走到2状态的期望步数。
A:f[0]=1/2(f[0]+1+f[1]+1)
A:f[1]=1/2(f[0]+1+f[2]+1)
A:f[2]=0
根据高斯消元可以解出f[0]=6
Q:推广到问期望投掷几次后连续出n个反面
A:其实是一样的,f[i]=1/2(f[0]+f[i+1])+1,f
=0,然后高斯消元解出f[0]=2^(n+1)-2
感觉跟这道题有异曲同工之妙
设f[i]表示i到n的异或和为1的期望值,则f
=0
那么显然,如果x由v转移过来,f[x]=Σf[v]/d[v] (c[i]=0)+Σ(1-f[v])/d[v] (c[i]=1)
这样的f可以用高斯消元+预处理解出来,问题好办了
解出方程后f[1]*2^k就是第k位对答案的贡献值
要特别注意二进制循环的范围,如果是33就会错。
Q:投掷一个硬币 出正反面的概率相等 问期望投掷几次后连续出两个反面
A:设f[0],f[1],f[2]为从 0、1、2状态开始,走到2状态的期望步数。
A:f[0]=1/2(f[0]+1+f[1]+1)
A:f[1]=1/2(f[0]+1+f[2]+1)
A:f[2]=0
根据高斯消元可以解出f[0]=6
Q:推广到问期望投掷几次后连续出n个反面
A:其实是一样的,f[i]=1/2(f[0]+f[i+1])+1,f
=0,然后高斯消元解出f[0]=2^(n+1)-2
感觉跟这道题有异曲同工之妙
题目:
我是超链接题解:
我们可以把路径长度按位分解一下,这样最后加的时候按位加就好了设f[i]表示i到n的异或和为1的期望值,则f
=0
那么显然,如果x由v转移过来,f[x]=Σf[v]/d[v] (c[i]=0)+Σ(1-f[v])/d[v] (c[i]=1)
这样的f可以用高斯消元+预处理解出来,问题好办了
解出方程后f[1]*2^k就是第k位对答案的贡献值
要特别注意二进制循环的范围,如果是33就会错。
代码:
#include <cmath> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const double eps=1e-9; const int N=10005; int tot,nxt[N*2],point ,v[N*2],c[N*2],n; double a[105][105],b[105],f[105],du[105]; int dcmp(double a) { if (a<eps && a>-eps) return 0; if (a>0) return 1;return -1; } void addline(int x,int y,int z){++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; c[tot]=z;} void gauss() { for (int i=1;i<n;i++) { int num=i; for (int j=i+1;j<n;j++) if (fabs(a[num][i])<fabs(a[j][i])) num=j; for (int j=i;j<n;j++) swap(a[num][j],a[i][j]); swap(b[num],b[i]); for (int j=i+1;j<n;j++) { double t=a[j][i]/a[i][i]; for (int k=i;k<n;k++) a[j][k]-=a[i][k]*t; b[j]-=b[i]*t; } } for (int i=n-1;i>=1;i--) { f[i]=b[i]/a[i][i]; for (int j=1;j<i;j++) b[j]-=f[i]*a[j][i]; } } int main() { int m;scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y,z;scanf("%d%d%d",&x,&y,&z); du[y]++;addline(x,y,z); if (x!=y) du[x]++,addline(y,x,z); } double ans=0; for (int k=0;k<32;k++) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for (int i=1;i<n;i++) { a[i][i]=1; for (int j=point[i];j;j=nxt[j]) if (c[j]>>k&1) b[i]+=1.00/du[i],a[i][v[j]]+=1.00/du[i]; else a[i][v[j]]-=1.00/du[i]; } gauss(); if (dcmp(f[1])) ans+=f[1]*(1<<k); } printf("%.3lf",ans); }
相关文章推荐
- bzoj 2337: [HNOI2011]XOR和路径 (概率与期望DP+高斯消元)
- [BZOJ2337][HNOI2011]XOR和路径(概率期望dp+高斯消元)
- 【BZOJ 2337】 2337: [HNOI2011]XOR和路径(概率DP、高斯消元)
- BZOJ 2337|HNOI 2011|XOR和路径|概率期望|高斯消元
- BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]
- BZOJ 2337 HNOI2011 XOR和路径 期望DP+高斯消元
- bzoj 2337: [HNOI2011]XOR和路径 期望dp+高斯消元
- 【bzoj2337】[HNOI2011]XOR和路径 期望dp+高斯消元
- 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径
- 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径
- 【BZOJ2337】[HNOI2011]XOR和路径 期望DP+高斯消元
- 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元
- [BZOJ2337] [HNOI2011] XOR和路径 期望 + 按位处理 + 高斯消元
- [BZOJ2337][HNOI2011]XOR和路径-高斯消元-期望
- 2337: [HNOI2011]XOR和路径 高斯消元解期望方程 概率与期望DP
- [BZOJ2337][HNOI2011]XOR和路径(概率+高斯消元)
- 【BZOJ2337】XOR和路径,概率期望DP+高斯消元
- [BZOJ]2337: [HNOI2011]XOR和路径 期望+高斯消元
- bzoj 2337 [HNOI2011]XOR和路径【高斯消元+dp】
- [BZOJ2337][HNOI2011]XOR和路径(高斯消元解期望方程)