HDU 1722 Cake
这道题有一个简单的思路 就是 a+b-gcd(a,b);
另一种就是就是递归求解。
(1) 当Max == Min时,显然蛋糕要均匀的要分成Max(Min)份。
(2)当 Max != Min 时,设m = Max/gcd(Max,Min)*Min;
此时应该将蛋糕的 (Min*Min)/m 部分分成 Min份,即每份Min/m = Min*Min*gcd(Min,Max)/Max。
把剩下的部分看成一个新的蛋糕去均匀的分给Min和Max-Min个人。
直到Min == Max-Min,递归结束。
当剩下的部分分成的份数可以均匀的分给Min 和 Max-Min个人时候,整个蛋糕可以均匀分给Max和Min个人。
所以只需要不断的递归调用第二步,直到符合第一步的条件。
当剩下的部分 有:
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 }