为什么 RE
查看原帖
为什么 RE
1135901
Programming_Konjac楼主2024/11/3 23:35

rt,不知道为什么 RE

#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct frac{
	long long fenzi,fenmu;
	bool neg;
	frac(long long _fenzi=0,long long _fenmu=1){
		fenzi=_fenzi;
		if(fenzi<0) fenzi=-fenzi,neg=!neg;
		fenmu=_fenmu;
		if(fenmu<0) fenmu=-fenmu,neg=!neg;
	}
};
ll gcd(ll a,ll b);
ll lcm(ll a,ll b);
frac add(frac a,frac b);
frac add(frac a,long long b);
frac add(long long a,frac b);
frac erase(frac a,frac b);
frac erase(frac a,long long b);
frac erase(long long a,frac b);
frac times(frac a,frac b);
frac times(frac a,long long b);
frac times(long long a,frac b);
frac div(frac a,frac b);
frac div(frac a,long long b);
frac div(long long a,frac b);
void out(frac a,bool flag);
frac yuefen(frac a);
frac a[105][105];
int n,m;
bool gaosi(){
	int now=1,to;
	frac t;
	for(int i=1; i<=n; i++){
		for(to=now; to<=n; to++){
			if(a[to][i].fenzi>0) break;
		}
		if(to>n) continue;
		if(to!=now){
			for(int j=1; j<=m;j++){
				swap(a[to][j],a[now][j]);
			}
		}
		t=a[now][i];
		for(int j=1; j<=m; j++) a[now][j]=div(a[now][j],t);
		for(int j=1; j<=n; j++){
			if(j==now) continue;
			t=a[j][i];
			for(int k=1; k<=m; k++){
				a[j][k]=erase(a[j][k],times(t,a[now][k]));
			}
		}now++;
	}
	return now>n;
}
int main(){
	cin>>n;
	m=n+1;
	for(int i=1; i<=n; i++){
		for(int j=1; j<=m; j++){
			int x;
			cin>>x;
			a[i][j].fenzi=x;
			a[i][j].fenmu=1;
		}
	}
	if(gaosi()){
		for(int i=1; i<=n; i++){
			out(a[i][m],1);
			cout<<"\n";
		}
	}
	else cout<<"No Solution";
	return 0;
}
ll gcd(ll a,ll b){
	return a%b==0?b:gcd(b,a%b);
}
ll lcm(ll a,ll b){
	return a/gcd(a,b)*b;
}
void out(frac a,bool flag){
	if(flag==0){
		if(a.fenzi==0) cout<<0;
		else{
			if(a.neg==1) cout<<"-";
			if(a.fenmu==1) cout<<a.fenzi;
			else cout<<"\\frac{"<<a.fenzi<<"}{"<<a.fenmu<<"}";	
		}	
	}
	else{
		if(a.neg==1) cout<<"-";
		printf("%.2lf",a.fenzi*1.00000000/a.fenmu);
	}
}
frac yuefen(frac a){
	if(a.fenzi==0){
		return frac(0,1);
	}
	else{
		ll k=gcd(a.fenzi,a.fenmu);
		a.fenzi/=k;
		a.fenmu/=k;
		return a;
	}
}
frac add(frac a,frac b){
	if(a.neg==0&&b.neg==0){
		ll c=lcm(a.fenmu,b.fenmu);
		ll d=c/a.fenmu,e=c/b.fenmu;
		a.fenzi*=d;
		a.fenmu*=d;
		b.fenzi*=e;
		b.fenmu*=d;
		a.fenzi+=b.fenzi;
		return yuefen(a);	
	}
	else if(a.neg==1&&b.neg==0){
		a.neg=0;
		return erase(b,a);
	}
	else if(a.neg==0&&b.neg==1){
		b.neg=0;
		return erase(a,b);
	}
	else{
		ll c=lcm(a.fenmu,b.fenmu);
		ll d=c/a.fenmu,e=c/b.fenmu;
		a.fenzi*=d;
		a.fenmu*=d;
		b.fenzi*=e;
		b.fenmu*=d;
		a.fenzi+=b.fenzi;
		return yuefen(a);
	}
}
frac add(frac a,long long b){
	frac c(b,1);
	return add(a,c);
}
frac add(long long a,frac b){
	frac c(a,1);
	return add(c,b);
}
frac erase(frac a,frac b){
	if(a.neg==0&&b.neg==0){
		ll c=lcm(a.fenmu,b.fenmu);
		ll d=c/a.fenmu,e=c/b.fenmu;
		a.fenzi*=d;
		a.fenmu*=d;
		b.fenzi*=e;
		b.fenmu*=d;
		if(a.fenzi>=b.fenzi) a.fenzi-=b.fenzi;
		else{
			a.neg=1;
			a.fenzi=b.fenzi-a.fenzi;
		}
		return yuefen(a);	
	}
	else if(a.neg==1&&b.neg==0){
		a.neg=0;
		a=add(a,b);
		a.neg=1;
		return yuefen(a);
	}
	else if(a.neg==0&&b.neg==1){
		b.neg=0;
		return add(a,b);
	}
	else{
		ll c=lcm(a.fenmu,b.fenmu);
		ll d=c/a.fenmu,e=c/b.fenmu;
		a.fenzi*=d;
		a.fenmu*=d;
		b.fenzi*=e;
		b.fenmu*=d;
		if(a.fenzi>=b.fenzi) a.fenzi-=b.fenzi;
		else{
			a.neg=0;
			a.fenzi=b.fenzi-a.fenzi;
		}
		return yuefen(a);
	}
}
frac erase(frac a,long long b){
	frac c(b,1);
	return erase(a,c);
}
frac erase(long long a,frac b){
	frac c(a,1);
	return erase(c,b);
}
frac times(frac a,frac b){
	if(a.neg==0&&b.neg==0){
		a.fenmu*=b.fenmu;
		a.fenzi*=b.fenzi;
		return yuefen(a);	
	}
	else if(a.neg==1&&b.neg==0){
		a.fenmu*=b.fenmu;
		a.fenzi*=b.fenzi;
		return yuefen(a);
	}
	else if(a.neg==0&&b.neg==1){
		a.fenmu*=b.fenmu;
		a.fenzi*=b.fenzi;
		a.neg=1;
		return yuefen(a);
	}
	else{
		a.fenmu*=b.fenmu;
		a.fenzi*=b.fenzi;
		a.neg=0;
		return yuefen(a);
	}
}
frac times(frac a,long long b){
	frac c(b,1);
	return times(a,c);
}
frac times(long long a,frac b){
	frac c(a,1);
	return times(c,b);
}
frac div(frac a,frac b){
	swap(b.fenmu,b.fenzi);
	return times(a,b);
}
frac div(frac a,long long b){
	frac c(b,1);
	return div(a,c);
}
frac div(long long a,frac b){
	frac c(a,1);
	return div(c,b);
}
2024/11/3 23:35
加载中...