HDU 1722 Cake

  這道題有一個簡單的思路 就是  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 }
View Code
相關文章
相關標籤/搜索