问题描述
现在有a,b,c三种原料,如果他们按x:y:z混合,就能产生一种神奇的物品d。
当然不一定只产生一份d,但a,b,c的最简比一定是x:y:z
现在给你3种可供选择的物品:
每个物品都是由a,b,c以一定比例组合成的,求出最少的物品数,使得他们能凑出整数个d物品(这里的最少是指三者个数的总和最少)
输入格式
第一行三个整数,表示d的配比(x,y,z)
接下来三行,表示三种物品的配比,每行三个整数(<=10000)。
输出格式
四个整数,分别表示在最少物品总数的前提下a,b,c,d的个数(d是由a,b,c配得的)
目标答案<=10000
如果不存在满足条件的方案,输出NONE
样例输入
3 4 5
1 2 3
3 7 1
2 1 2
样例输出
8 1 5 7
你列两个方程解方程就对了,输入的参数用字母代替,最后就会出结果的, 最后求解出相对应的参数;
具体解析私我吧,我推算了一张纸。纯数学,没有涉及算法。
AC代码:
# include <stdio.h>
# include <iostream>
using namespace std;
typedef long long int ll;
ll g[10][10];
ll gcd(ll a, ll b){
if(a==0)return b;
if(b==0)return a;
if(a%b==0){
return b;
}
return gcd(b, a%b);
}
int main(){
ll i, j, k, a, b, c;
ll A, B, C, D, E, F, x, y, z;
cin>>a>>b>>c;
for(i=1; i<=3; i++){
for(j=1; j<=3; j++){
cin>>g[i][j];
}
}
A=a*g[1][2]-b*g[1][1];B=a*g[2][2]-b*g[2][1];C=a*g[3][2]-b*g[3][1];
D=b*g[1][3]-c*g[1][2];E=b*g[2][3]-c*g[2][2];F=b*g[3][3]-c*g[3][2];
z=B*D-A*E;
y=A*F-D*C;
x=C*E-B*F;
if(z<0){
z=-z;y=-y;x=-x;
}
if(z<0||y<0||z<0){
cout<<"NONE";
return 0;
}
ll temp=gcd(x, y);
temp=gcd(temp, z);
x=x/temp;y=y/temp;z=z/temp;
cout<<x<<' '<<y<<' '<<z<<' '<<((x*g[1][1]+y*g[2][1]+z*g[3][1])/a);
return 0;
}