1743: 解方程
Description
一群奥特曼打败了一群小怪兽,已知所有的奥特曼均有x1个头、y1条腿(变异奥特曼),所有的小怪兽均有x2个头、y2条腿。战场上一共有q个头,w条腿,问有多少奥特曼,有多少个小怪兽?
Input
输入数据有多组每组包含6个正整数,分别为,x1,y1,x2,y2,q,w ;(0<=q,w<=1000000000);输入数据保证有唯一解。读到0 0 0 0 0 0结束。
Output
输出占一行,包含两个正整数,分别为:奥特曼和小怪兽的数目;
Sample Input
749 405 263 991 816625 693657 0 0 0 0 0 0
Sample Output
986 297
1 #include <stdio.h> 2 3 int main(void) 4 { 5 long long int x1,y1,x2,y2,q,w; 6 while(scanf("%lld %lld %lld %lld %lld %lld",&x1,&y1,&x2,&y2,&q,&w)!=EOF) 7 { 8 long long int i,k;//i是奥特曼数量,k是怪兽数量 9 if(x1==0&&y1==0&&x2==0&&y2==0&&q==0&&w==0) 10 { 11 break; 12 } 13 else 14 { 15 16 k=(q*y1-w*x1)/(x2*y1-x1*y2); 17 i=(q*y2-w*x2)/(x1*y2-y1*x2); 18 printf("%lld %lld\n",i,k); 19 } 20 21 } 22 return 0; 23 }
再来看看这个代码:(枚举?暴力?)
1 #include <stdio.h> 2 3 int main(void) 4 { 5 int x1,y1,x2,y2,q,w; 6 while(scanf("%d %d %d %d %d %d",&x1,&y1,&x2,&y2,&q,&w)!=EOF) 7 { 8 int i,k;//i是奥特曼数量,k是怪兽数量 9 if(x1==0&&y1==0&&x2==0&&y2==0&&q==0&&w==0) 10 { 11 return 1; 12 } 13 else 14 { 15 int temp1=q/x1,temp2=q/x2; 16 for(i=0;i<=temp1;i++) 17 { 18 for(k=0;k<=temp2;k++) 19 { 20 if(i*y1+k*y2==w&&i*x1+k*x2==q) 21 { 22 printf("%d %d\n",i,k); 23 break; 24 } 25 } 26 } 27 } 28 } 29 return 0; 30 }
对于奥特曼/怪兽的数量从零开始,虽然也能够求出数据,起码能够求出测试数据,但是随着数据的增大,for执行的次数也会增大,所以采用直接求解的方法,相当于求二元一次方程组,头数,脚数会是确定值,输入的数据会都是正整数除非全为0退出,所以
1 k=(q*y1-w*x1)/(x2*y1-x1*y2); 2 i=(q*y2-w*x2)/(x1*y2-y1*x2);
直接利用表达式求出对应的数量。
时间: 2024-10-09 21:17:18