有4组比例a:b:c,a1:b1:c1,a2:b2:c2,a3:b3:c3,求x,y,z使(a1*x+b1*y+c1*z):(a2*x+b2*y+c2*z):(a3*x+b3*y+c3*z)=a:b:c(0<=x,y,z<100)
其实也不是什么难题,直接100^3暴力就行。
不过细节还挺多的。
- 注意0的情况。
- 注意是大写的"NONE"
- 注意a:b:c(99:99:99!=1:1:1)
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
int a[4],b[4][4],s[4];
int main()
{
freopen("ratios.in","r",stdin);
freopen("ratios.out","w",stdout);
for(int i=1;i<=3;++i) a[i]=read();
int x=__gcd(a[1],a[2]),y=__gcd(a[1],a[3]);
int zz=__gcd(x,y);
for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j)
b[i][j]=read();
for(int i=0;i<100;++i)
for(int j=0;j<100;++j)
for(int k=0;k<100;++k){
s[1]=b[1][1]*i+b[2][1]*j+b[3][1]*k;
s[2]=b[1][2]*i+b[2][2]*j+b[3][2]*k;
s[3]=b[1][3]*i+b[2][3]*j+b[3][3]*k;
if(s[1]<a[1]||s[2]<a[2]||s[3]<a[3]) continue;
x=__gcd(s[1],s[2]),y=__gcd(s[1],s[3]);
int z=__gcd(x,y);
if(z!=0)
for(int l=1;l<=3;++l) s[l]/=z;
bool f=1;
for(int l=1;l<=3;++l)
if(s[l]!=a[l]/zz){f=0;break;}
if(f){
printf("%d %d %d %d\n",i,j,k,z/zz);
return 0;
}
}
puts("NONE");
}