這道題有一個簡單的思路 就是 a+b-gcd(a,b);ios
另外一種就是就是遞歸求解。ide
(1) 當Max == Min時,顯然蛋糕要均勻的要分紅Max(Min)份。spa
(2)當 Max != Min 時,設m = Max/gcd(Max,Min)*Min;code
此時應該將蛋糕的 (Min*Min)/m 部分分紅 Min份,即每份Min/m = Min*Min*gcd(Min,Max)/Max。blog
把剩下的部分當作一個新的蛋糕去均勻的分給Min和Max-Min我的。遞歸
直到Min == Max-Min,遞歸結束。ci
當剩下的部分分紅的份數能夠均勻的分給Min 和 Max-Min我的時候,整個蛋糕能夠均勻分給Max和Min我的。io
因此只須要不斷的遞歸調用第二步,直到符合第一步的條件。event
當剩下的部分 有:class
1 - (Min*Min)/m = (Max-Min^3*gcd(Max,Min) ) / Max
分紅Max-Min份時有 每份爲 Min*Min*gcd(Min,Max)/Max
顯然此時 Max 我的分得的蛋糕是同樣的。
當均勻地分紅Min份 設 每份爲 X 則 Min我的 每人分得Min*Min*gcd(Min,Max)/Max + x 的蛋糕。
顯然此時 Min我的分得的蛋糕也是同樣的。
1 #include <iostream> 2 3 #define LL long long int 4 5 using namespace std; 6 7 int gcd(int p,int q) 8 { 9 if(q == 0) 10 return p; 11 return gcd(q,p%q); 12 } 13 14 void swap(LL &a,LL &b) 15 { 16 LL temp; 17 temp = a; 18 a = b; 19 b = temp; 20 } 21 22 LL sum; 23 24 void cal(LL a,LL b) 25 { 26 if(a == b) 27 { 28 sum += a; 29 return ; 30 } 31 if(a < b) 32 { 33 swap(a,b); 34 } 35 sum += b; 36 cal(b,a-b); 37 } 38 39 int main() 40 { 41 LL Min,Max; 42 43 while(cin>>Min>>Max) 44 { 45 sum = 0; 46 cal(Min,Max); 47 cout<<sum<<endl; 48 } 49 50 return 0; 51 }