题意:
给出一瓶可乐(S毫升)和两个不同容积的杯子(a,b毫升),可以相互倒可乐,要求两人喝掉相同的可乐,如果能平分则输出最少次数,否则输出“NO”。
分析:
这题表面看上去是个bfs枚举所有状态暴搜即可,但是细想发现这是个数论题,设g=gcd(a,b),则如果S/g%2!=0,说明无论怎样倒可乐都不可能平分。若有解,则必然存在(a/g)x+(b/g)y=(a+b)/2g。解不定方程即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #define range(i,a,b) for(int i=a;i<=b;++i) #define LL long long #define rerange(i,a,b) for(int i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; int n,a,b; void init(){ } int gcd(int a,int b){ return b?gcd(b,a%b):a; } void solve(){ while(cin>>n>>a>>b,n,a,b){ n/=gcd(a,b); if(n&1)cout<<"NO"<<endl; else cout<<n-1<<endl; } } int main() { init(); solve(); return 0; }