bzoj2337 XOR和路径
最近高斯消元刷的有点多啊。但这个题并不是解xor方程的,其实xor跟这个题实在是没有太大的关系。
对于这种路径上求xor的题,我们可以逐位考虑,这样就变成了0和1之间的运算。那么对于每一个点,我们记录这个点出发到n的期望xor和f[i],显然f[n]=0。
那么f[i]=Σf[j]/d[i](w[i,j]=0)+Σ(1-f[j])/d[i](w[i][j]=1),为什么是1-f[j]呢,因为我们求的是某一位的xor和,相当于一次值域在[0,1]之内的取反操作(不知道这么表述是否严谨),于是1-f[j]相当于把这个点的期望值xor和取反。那么f[1]就是我们想要的值。
那么最后统计答案就是2i*v[i],v[i]表示第i位的期望xor值。
有一个小技巧,由于我们只需要求f[1],我们把f[1]这个变量放到最后一个去消元,这样就省得回带了。
注意这里最好用longdouble,否则精度会出一些奇怪的问题。
xor
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #define maxn 600 7 #define maxm 12000 8 #define bit 32 9 #define eps 1e-9 10 #define inf 1000000000 11 using namespace std; 12 typedef long double lb; 13 lb a[maxn][maxn],v[100]; 14 int d[maxn],t[maxn][maxn],w[maxn][maxn]; 15 int n,m; 16 17 lb fb(lb x) 18 { 19 return (x>0)?x:-x; 20 } 21 22 lb gauss(int n) 23 { 24 int k=1; 25 for (int i=n;i;i--) 26 { 27 int p=0; 28 for (int j=k;j<=n;j++) 29 if (fb(a[j][i])>eps) { p=j; break; } 30 if (!p) continue; 31 for (int l=1;l<=n+1;l++) swap(a[p][l],a[k][l]); 32 for (int j=k+1;j<=n;j++) 33 if (fb(a[j][i])>eps) 34 { 35 lb rate=a[j][i]/a[k][i]; 36 for (int l=1;l<=n+1;l++) 37 a[j][l]=a[j][l]-a[k][l]*rate; 38 } 39 k++; 40 } 41 return a[k-1][n+1]/a[k-1][1]; 42 } 43 44 void fill() 45 { 46 for (int i=1;i<=n;i++) 47 for (int j=1;j<=n+1;j++) 48 a[i][j]=0; 49 } 50 51 int main() 52 { 53 //freopen("xor.in","r",stdin); 54 //freopen("xor.out","w",stdout); 55 scanf("%d%d",&n,&m); 56 int x,y,z; 57 for (int i=1;i<=m;i++) 58 { 59 scanf("%d%d%d",&x,&y,&z); 60 t[x][++d[x]]=y; 61 w[x][d[x]]=z; 62 if (x==y) continue; 63 t[y][++d[y]]=x; 64 w[y][d[y]]=z; 65 } 66 for (int p=1;p<=bit;p++) 67 { 68 fill(); 69 for (int i=1;i<=n-1;i++) 70 { 71 a[i][i]=1; 72 for (int j=1;j<=d[i];j++) 73 { 74 int k=t[i][j]; 75 if ((w[i][j]>>(p-1))&1) a[i][k]+=1.0/d[i],a[i][n+1]+=1.0/d[i]; 76 else a[i][k]-=1.0/d[i]; 77 } 78 } 79 a[n][n]=1; 80 v[p]=gauss(n); 81 } 82 lb cnt=1,ans=0; 83 for (int i=1;i<=bit;i++) 84 { 85 ans+=cnt*v[i]; 86 cnt*=2.0; 87 } 88 printf("%.3lf\n",(double)ans); 89 return 0; 90 }
AC without art, no better than WA !