luogu3389
https://www.luogu.org/problemnew/show/3389
板子题
#include<cstdio> #include<cstdlib> #define ROF(i,s,t) for(register int i=s;i>=t;--i) #define FOR(i,s,t) for(register int i=s;i<=t;++i) typedef double db; int n; db a[233][233]; db ans[233]; inline void gauss(){ db mult; FOR(i,1,n){ FOR(j,i+1,n){ mult=-a[j][i]/a[i][i]; FOR(k,i,n+1) a[i][k]*=mult,a[j][k]+=a[i][k]; if(!a[j][j]){ puts("No Solution"); exit(0); } } } } inline void back(){ db b; ROF(i,n,1){ b=0; FOR(j,i+1,n) b+=a[i][j]*ans[j]; ans[i]=(a[i][n+1]-b)/a[i][i]; } } int main(){ scanf("%d",&n); FOR(i,1,n) FOR(j,1,n+1) scanf("%lf",&a[i][j]); gauss(); back(); FOR(i,1,n) printf("%.2lf ",ans[i]); return 0; }
BZOJ1013
http://www.lydsy.com/JudgeOnline/problem.php?id=1013
然后用1~n式减去(n+1)式,得到n个式子,x2和r2均被消去
得到n元线性方程组
然后高斯消元搞搞出解
#include<cstdio> #include<cstdlib> #define ROF(i,s,t) for(register int i=s;i>=t;--i) #define FOR(i,s,t) for(register int i=s;i<=t;++i) typedef double db; int n; db a[66][66],b[66][66],ans[66]; inline void gauss(){ db mult; FOR(i,1,n){ FOR(j,i+1,n){ mult=-b[j][i]/b[i][i]; FOR(k,i,n+1) b[i][k]*=mult,b[j][k]+=b[i][k]; } } } inline void back(){ db c; ROF(i,n,1){ c=0; FOR(j,i+1,n) c+=b[i][j]*ans[j]; ans[i]=(b[i][n+1]-c)/b[i][i]; } } int main(){ scanf("%d",&n); FOR(i,1,n+1){ FOR(j,1,n){ scanf("%lf",&a[i][j]); a[i][n+1]-=a[i][j]*a[i][j]; a[i][j]=-2.00*a[i][j]; } } FOR(i,1,n) FOR(j,1,n+1) b[i][j]=a[i][j]-a[n+1][j]; gauss(); back(); printf("%.3lf",ans[1]); FOR(i,2,n) printf(" %.3lf",ans[i]); return 0; }