hihocoder1195
高斯消元模板题
标程
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define SF scanf
#define PF printf
#define MAXN 510
#define EPS 1e-8
using namespace std;
double a[MAXN][MAXN],x[MAXN];
int n,m,Rank,f[MAXN],flag;
void init(){
memset(a,0,sizeof a);
for(int i=0;i<n;i++)
for(int j=0;j<=m;j++)
SF("%lf",&a[i][j]);
}
void gauss(){
int r,c,maxr;
for(r=0,c=0;r<n&&c<m;r++,c++){
maxr=r;
for(int i=r+1;i<n;i++)
if(fabs(a[i][c])>fabs(a[maxr][c]))
maxr=i;
if(fabs(a[maxr][c])<EPS){
flag=1;
r--;
continue;
}
if(maxr!=r)
for(int i=c;i<=m;i++)
swap(a[r][i],a[maxr][i]);
for(int i=0;i<n;i++)
if(i!=r&&fabs(a[i][c])>EPS)
for(int j=m;j>=c;j--)
a[i][j]-=a[r][j]/a[r][c]*a[i][c];
}
Rank=r;
}
bool check(){
int cnt,pos;
for(int i=Rank;i<n;i++)
if(fabs(a[i][m])>EPS)
return 0;
for(int i=0;i<m;i++)
f[i]=1;
for(int i=Rank-1;i>=0;i--){
cnt=0;
for(int j=0;j<m;j++)
if(fabs(a[i][j])>EPS&&f[j]){
cnt++;
pos=j;
}
if(cnt==1){
f[pos]=0;
x[pos]=a[i][m]/a[i][pos];
}
}
return 1;
}
void print(){
int i;
for(int i=0;i<m;i++)
PF("%d\n",int(x[i]+0.5));
}
int main(){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
SF("%d%d",&m,&n);
init();
gauss();
if(check()){
if(flag==1)
PF("Many solutions");
else
print();
}
else
PF("No solutions");
}
对拍程序(结果一定有解,数据很小,对排不出来可以将范围改大)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<ctime>
#define SF scanf
#define PF printf
#define MAXN 1010
using namespace std;
int get_rand(int x){
return rand()*rand()%x+1;
}
int ans[MAXN],x[MAXN][MAXN],tot;
int main(){
freopen("data.in","w",stdout);
srand(time(0));
int m=get_rand(5);
int n=get_rand(m)+m;
PF("%d %d\n",m,n);
for(int i=0;i<m;i++)
ans[i]=get_rand(10000);
for(int i=0;i<n;i++){
tot=0;
for(int j=0;j<m;j++){
x[i][j]=get_rand(10);
tot+=x[i][j]*ans[j];
PF("%d ",x[i][j]);
}
PF("%d\n",tot);
}
}