1. 程式人生 > >杭電 1772 cake

杭電 1772 cake

sstream include title std bmi sam logs 就會 有一個

Cake

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4617 Accepted Submission(s): 2299


Problem Description 一次生日Party可能有p人或者q人參加,現準備有一個大蛋糕.問最少要將蛋糕切成多少塊(每塊大小不一定相等),才能使p人或者q人出席的任何一種情況,都能平均將蛋糕分食.

Input 每行有兩個數p和q.

Output 輸出最少要將蛋糕切成多少塊.

Sample Input 2 3

Sample Output 4 Hint 將蛋糕切成大小分別為1/3,1/3,1/6,1/6的四塊即滿足要求. 當2個人來時,每人可以吃1/3+1/6=1/2 , 1/2塊。 當3個人來時,每人可以吃1/6+1/6=1/3 , 1/3, 1/3塊。

思路:想像一個蛋糕,然後先按p個人來分,然後再根據p來分的刀痕,再來分q的份,那就會有gcd(p,q)的刀痕是重疊的,也就是說,最後的刀痕數目就是p+q-gcd(p,q). 附上代碼:
#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include
<string> #include<map> #include<vector> #include<list> #include<algorithm> #include<stdlib.h> #include<iterator> #include<sstream> #include<string.h> #include<stdio.h> using namespace std; long long gcd(long long a,long long b) { long long
big=a; long long smal=b; long long ck; if(big<smal) { ck=a; a=b; b=a; } long long temp; while(smal>0) { temp=big%smal; big=smal; smal=temp; } return big; } long long gys(long long a,long long b) { long long kk; long long ak=a; long long bk=b; kk=ak*bk/gcd(ak,bk); return kk; } int main() { int m,n; while(cin>>m>>n) { int temp=gcd(m,n); cout<<m+n-temp<<endl; } return 0; }

杭電 1772 cake