rt,求调。
#include <iostream>
using namespace std;
const int N=500+5;
double a[N][N],w[N][N],ans[N];
bool freeopen[N];
int n,m,iac[N];
//n+1项为b
//f(S)+f(T)=f(S U T),S 交 T = 空集,使得可以用前缀和,列出方程
void modify(int t1,int t2,double q){
a[t1][t2]+=q;
}
void solve(){//消元
double qwq;
for (int i=1,j=1;i<=n && j<=m;++i){
for (int k=i+1;k<=n;++k)
if (a[k][j]){
for (int p=1;p<=m+1;++p) swap(a[i][p],a[k][p]);
break;
}
if (a[i][j]){
for (int k=1;k<=n;++k){
if (i==k) continue;
qwq=a[k][j]/a[i][j];
for (int q=1;q<=m+1;++q){
a[k][q]=a[k][q]-a[i][q]*qwq;
}
}
iac[j]=i;
freeopen[j]=0;
}else{
--i;
}
++j;
for (int j=1;j<=n;++j){
bool f=1;
for (int k=1;k<=m;++k){
if (a[j][k]){f=0;break;}
}
if (f && a[j][m+1]){
cout<<"qwq\n";
exit(11);
}
}
}
}
int main(){
int q;
cin >> n >> q;m=n;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
cin >> w[i][j];
double p=1.0*(n-1)/n;
for (int i=1;i<n;++i){
modify(i,i,1-n);
for (int j=1;j<=n;++j){
if (j==i) continue;
modify(i,j,w[i][j]);
modify(i,i,w[i][j]);
}
}
// for ()
for (int i=1;i<=n+1;++i) modify(n,i,1);
// for (int i=1;i<=n+1;++i){
// for (int j=1;j<=n+1;++j){
// printf("%.3lf ",a[i][j]);
// }
// cout<<endl;
// }
// ++n;
solve();
// --n;
for (int i=1;i<=n;++i) ans[i]=a[iac[i]][m+1]/a[iac[i]][i];
// for (int i=1;i<=n;++i){
// printf("%.10lf\n",ans[i]);
// }
string str;
for (int i=1;i<=q;++i){
cin >> str;
double res=0;
for (int j=1;j<=n;++j){//组合
if (str[j-1]=='1') res+=ans[j];
}
printf("%.7lf\n",res);
}
cout.flush();
return 0;
}
WA 0?