HDU - 1495
虽然用BFS暴力上去很好做,但是用GCD的方法会好写很多。
假设 A,B,C 3个杯子大小递减,饮料一开始是装在A里的。
那么在这3个杯子之间能够允许的被转移的饮料的最小量就是GCD(B,C)。
这样一来,只用看A是GCD的多少倍就行了,如果是奇数倍则不能平分,输出NO;否则输出A/GCD-1(有一份是留在A里没有动的,所以要减一)
最后这两份饮料一定是分别在A和B里的。
一个8,6,2的例子:
0: 8 0 0
1: 2 6 0
2: 2 4 2
3: 4 4 0
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int s,n,m;
while(cin>>s>>n>>m,s+n+m)
{
s/=__gcd(n,m);
if(s&1)cout<<"NO"<<endl;
else cout<<s-1<<endl;
}
return 0;
}
如果还是不理解的话,建议参照这篇大神的blog
HDU 1495 非常可乐(数论)