题目可以转换成这个:
给定一个
n∗n
矩阵
A
,和一个
使得
A∗a=k∗b
,且
∑ni=1k∗bi
最小。
然后我们可以从1到100枚举k。
然后求每一个解。
求方程解可以使用克拉默法则。即:
xj=Dj/D
。
D
是原矩阵的行列式,
若
D
为0,则代表无解,如果
/*
ID: xdujlx1
PROG: ratios
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
int b[3];
int A[3][3];
void ioinit()
{
freopen("ratios.in","r",stdin);
freopen("ratios.out","w",stdout);
}
int det(int C[][3])
{
int res=1;
for(int i=0;i<3;i++)
{
for(int j=i+1;j<3;j++)
{
while(C[j][i])
{
int t=C[i][i]/C[j][i];
for(int k=i;k<3;k++)
{
C[i][k]-=C[j][k]*t;
swap(C[i][k],C[j][k]);
}
res=-res;
}
}
if(C[i][i]==0) return 0;
res*=C[i][i];
}
return res;
}
int main()
{
ioinit();
int C[3][3];
cin>>b[0]>>b[1]>>b[2];
for(int j=0;j<3;j++)
for(int i=0;i<3;i++)
cin>>A[i][j];
memcpy(C,A,sizeof(A));
int x=det(C);
if(x==0)
{
puts("NONE");
return 0;
}
int ans=1;
int a[3];
for(;ans<100;ans++)
{
int i;
for(i=0;i<3;i++)
{
memcpy(C,A,sizeof(A));
for(int j=0;j<3;j++)
C[j][i]=ans*b[j];
int y=det(C);
if((x<0&&y>0)||(x>0&&y<0)||y%x) break;
a[i]=y/x;
}
if(i==3) break;
}
if(ans==100) puts("NONE");
else printf("%d %d %d %d\n",a[0],a[1],a[2],ans);
return 0;
}