高斯消元的玄学.....
查看原帖
高斯消元的玄学.....
299810
issue_is_fw楼主2021/3/9 20:47

去掉就能ac

if( fabs( mp[i][i] )<eps )	continue;

但这不是特判零吗??因为这调了几个小时了....

#include <bits/stdc++.h>
using namespace std;
const long double eps = 1e-10;
#define ULL unsigned long long
const ULL base = 131;
const int maxn = 1009;
long double mp[maxn][maxn],po[maxn];
char s[maxn];
int n,m;
ULL p[maxn],suf[maxn][maxn],pre[maxn][maxn];
void guass(int n)
{
	for(int i=0;i<=n;i++)	
	{
		int r = i;
		for(int j=i+1;j<=n;j++)
			if( fabs(mp[r][i])<fabs(mp[j][i]) )	r = j;
		if( i!=r )	swap( mp[i],mp[r] );
//		if( fabs( mp[i][i] )<eps )	continue;
		double div = mp[i][i];
		for(int j=i;j<=n+1;j++)	mp[i][j] /= div;
		for(int j=0;j<=n;j++)
		{
			if( i==j )	continue;
			div = mp[j][i];
			for(int k=i;k<=n+1;k++)	mp[j][k] -= div*mp[i][k];
		}
	}
	for(int i=1;i<=n;i++)	printf("%.10lf\n",(double)mp[i][n+1] );
}
int main()
{
	cin >> n >> m;
	p[0] = 1; po[0] = 1;
	for(int i=1;i<=m;i++)	p[i] = p[i-1]*base,po[i] = po[i-1]*0.5;
	for(int i=1;i<=n;i++)
	{
		cin >> ( s+1 );
		for(int j=1;j<=m;j++)	pre[i][j] = pre[i][j-1]*base+s[j];
	}
	for(int i=1;i<=n;i++)
	{
		mp[i][i] = 1; mp[i][0] = -po[m];
		for(int j=1;j<=n;j++)
		{
			for(int k=1;k<m;k++)
			{
				if( pre[i][k]==pre[j][m]-pre[j][m-k]*p[k] )	mp[i][j] += po[m-k]; 
			}
		}
	}
	for(int i=1;i<=n+1;i++)	mp[0][i] = 1;
	guass(n);
}
2021/3/9 20:47
加载中...