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 }
View Code

 

posted @ 2013-09-03 19:58  好小孩  阅读(193)  评论(0编辑  收藏  举报