真の意味の下でリニアグループ裸のタイトル
通常、我々はバイナリのためにOIでリニア主基について言うが、ここでは線形ベクトルに基づいており、ベース線形回帰の起源です
我々は、線形のバイナリベースのアルゴリズムを検討し、それがバイナリビットの数に分解の数が主に
その後、主に使用されるバック消去の数に対応する数に各ビットであり、XOR
そして、何のベクトルについて、我々は対応するベクトルにすべてのベクトルを考慮して、電流を排除するために、この1の後に、このビットを使用します
だから、それを操作する方法を、実際には、それはガウス消去法は、私たちは一般線型群構造の類推方法に来ます
次に、この問題のために、私たちが考えることができる欲張りな線形相関のベクトルの集合が存在する場合、それは確かにそれはより良い、より大きな削除されているとしての価値に大きな小規模からプット機器は、追加しました
そうして上でこの問題は、精度カードへの配慮があるだろう、それが開くことを提案しましたlong double
コード
#include<cstdio>
#include<cmath>
#include<algorithm>
#define RI register int
#define CI const int&
using namespace std;
const int N=505;
const long double EPS=1e-6;
struct data
{
long double mat[N]; int val;
inline long double& operator [] (CI x) { return mat[x]; }
friend inline bool operator < (const data& A,const data& B)
{
return A.val<B.val;
}
}a[N]; int n,m,p[N],ans1,ans2;
int main()
{
RI i,j,k; for (scanf("%d%d",&n,&m),i=1;i<=n;++i)
for (j=1;j<=m;++j) scanf("%Lf",&a[i][j]);
for (i=1;i<=n;++i) scanf("%d",&a[i].val);
for (sort(a+1,a+n+1),i=1;i<=n;++i) for (j=1;j<=m;++j)
{
if (fabs(a[i][j])<EPS) continue;
if (!p[j]) { p[j]=i; ++ans1; ans2+=a[i].val; break; }
double dv=1.0*a[i][j]/a[p[j]][j];
for (k=j;k<=m;++k) a[i][k]-=dv*a[p[j]][k];
}
return printf("%d %d",ans1,ans2),0;
}