Clarke and chemistry
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 149 Accepted Submission(s): 79
Problem Description
Clarke is a patient with multiple personality disorder. One day, Clarke turned into a junior student and took a chemistry exam.
But he did not get full score in this exam. He checked his test paper and found a naive mistake, he was wrong with a simple chemical equation balancer.
He was unhappy and wanted to make a program to solve problems like this.
This chemical equation balancer follow the rules:
Two valences A combined by |A| elements and B combined by |B| elements.
We get a new valence C by a combination reaction and the stoichiometric coefficient of C is 1 . Please calculate the stoichiometric coefficient a of A and b of B that aA+bB=C, a,b∈N∗ .
But he did not get full score in this exam. He checked his test paper and found a naive mistake, he was wrong with a simple chemical equation balancer.
He was unhappy and wanted to make a program to solve problems like this.
This chemical equation balancer follow the rules:
Two valences A combined by |A| elements and B combined by |B| elements.
We get a new valence C by a combination reaction and the stoichiometric coefficient of C is 1 . Please calculate the stoichiometric coefficient a of A and b of B that aA+bB=C, a,b∈N∗ .
Input
The first line contains an integer
T(1≤T≤10)
, the number of test cases.
For each test case, the first line contains three integers A,B,C(1≤A,B,C≤26) , denotes |A|,|B|,|C| respectively.
Then A+B+C lines follow, each line looks like X c , denotes the number of element X of A,B,C respectively is c . ( X is one of 26 capital letters, guarantee X of one valence only appear one time, 1≤c≤100 )
For each test case, the first line contains three integers A,B,C(1≤A,B,C≤26) , denotes |A|,|B|,|C| respectively.
Then A+B+C lines follow, each line looks like X c , denotes the number of element X of A,B,C respectively is c . ( X is one of 26 capital letters, guarantee X of one valence only appear one time, 1≤c≤100 )
Output
For each test case, if we can balance the equation, print
a
and
b
. If there are multiple answers, print the smallest one,
a
is smallest then
b
is smallest. Otherwise print NO.
Sample Input
2 2 3 5 A 2 B 2 C 3 D 3 E 3 A 4 B 4 C 9 D 9 E 9 2 2 2 A 4 B 4 A 3 B 3 A 9 B 9
Sample Output
2 3 NO Hint: The first test case, $a=2, b=3$ can make equation right. The second test case, no any answer.
Source
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<list>
#include<vector>
using namespace std;
char stra[30],strb[30],strc[30];
int visa[30],visb[30],visc[30];
int main()
{
int a,b,c,i,j,t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&a,&b,&c);
int aa=0,bb=0,cc=0,x;
bool flag=true;
memset(visa,0,sizeof(visa));
memset(visb,0,sizeof(visb));
memset(visc,0,sizeof(visc));
for(i=0;i<a;++i){
scanf("%s%d",stra,&x);
visa[stra[0]-'A']+=x;
aa+=x;
}
for(i=0;i<b;++i){
scanf("%s%d",strb,&x);
visb[strb[0]-'A']+=x;
bb+=x;
}
for(i=0;i<c;++i){
scanf("%s%d",strc,&x);
if(!visa[strc[0]-'A']&&!visb[strc[0]-'A'])flag=false;
visc[strc[0]-'A']+=x;
cc+=x;
}
if(flag){
int x,y;
bool sign=false;
for(x=1;x*aa<=cc;++x){
for(y=1;x*aa+y*bb<=cc;++y){
if(x*aa+y*bb==cc){
//printf("%d %d\n",x,y);
for(i=0;i<=26;++i){
if((x*visa[i]+y*visb[i])!=visc[i])break;
}
//printf("%d \n",visa[i]);
if(i>26){
sign=true;
break;
}
}
}
if(sign)break;
}
if(sign){
printf("%d %d\n",x,y);
}
else {
printf("NO\n");
}
}
else {
printf("NO\n");
}
}
return 0;
}