题意:
给出一个杯子A容量ca , 杯子B容量cb; ca与cb是互质的.再给出目标水量n;
你可以做的是三件事,装满杯子,倒空杯子,将一个杯子的水倒到另一个杯子,要倒到一个杯子空了,或者另一个杯子满了;
目标是使B杯子有n的水量;其中ca <= cb ; n <= cb;
思路:
因为两个杯子的容量是互质的;我们可以得到一个定理;
ca%cb
(ca *2)% cb
(ca * 3) % cb
.....
(ca*cb - 1) % cb
得到的(cd - 1)个余数,分别是1到cb-1;(当然顺序不一定,但肯定是不重复的这cb-1个数)
所以我们可以知道n一定在这cb-1个余数当中 (n也可能等于cb,这种情况直接fill B就完了);
那么我们就要先算出n是ca * 几 求余cb的来了;
如果
ca * 2 % cb == n 那么只要倒满A弄到B,再倒满A弄到B就行了
当然这过程还有一些东西要考虑,就比如2 5 4这组样例.(2 *2 % 5) == 4;所以是要倒满A弄到B,再倒满A弄到B;我们要求的余数就是在B里;
那么另外一组样例3 5 4;开始是倒满A弄到B,然后在倒满A弄到B这时A里是1,B里是5;我们要求的余数1在A里,因为B到满了,余数就变成剩下的值留在A里了;
这时我们就要把B倒掉,把A倒到B里,使余数留在B中:
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
int ca,cb,n;
int main() {
while(scanf("%d%d%d",&ca,&cb,&n) != EOF) {
if(cb == n) {
printf("fill B\nsuccess\n");
continue;
}
int i;
for(i = 2 ; ; i++) {
if((ca * i ) % cb == n)
break;
}
int carry = 0;
printf("fill A\npour A B\n");
carry = ca;
for(int j = 1 ; j < i ; j++) {
printf("fill A\npour A B\n");
carry += ca;
if(carry > cb) {
printf("empty B\npour A B\n");
carry %= cb;
}
}
printf("success\n");
}
return 0;
}