Cake
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1785 Accepted Submission(s): 900
Problem Description
一次生日Party可能有p人或者q人参加,现准备有一个大蛋糕.问最少要将蛋糕切成多少块(每块大小不一定相等),才能使p人或者q人出席的任何一种情况,都能平均将蛋糕分食.
Input
每行有两个数p和q.
Output
输出最少要将蛋糕切成多少块.
Sample Input
2 3
Sample Output
4Hint将蛋糕切成大小分别为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块。
Author
LL
题意很明显了。
思路:找规律(AC了之后网上说是拓展欧几里得的变形o(╯□╰)o)。。。
怎么找:先P等分再Q等分呗,比如 2 3 先分成1/2,,1/2和1/3,1/3,1/3 然后再把大的(1/2)去分成1/6 1/3 1/6 1/3 ,发现O了4块,再看4 6 先分成1/4 1/4 1/4 1/4和1/6 1/6 1/6 1/6 1/6 1/6 ,然后把1/4 拆成1/12 1/6 1/12 1/6 1/12 1/6 1/12 1/6 又O了8块,再看3 7 分成1/3 1/3 1/3 和1/7 1/7 1/7 1/7 1/7 1/7 1/7 然后把1/3 拆成4/21 1/7 4/21 1/7 4/21 1/7 4/21 1/7发现1/7无法凑出,还少了4个 于是继续分把三个4/21都拿一个1/21出来组成一个1/7 剩下的自己又变成了1/7 刚好符合,这一下是9块。
然后我们假设1/P>1/Q,那么我们继续把1/P分解成P个1/Q和P个(1/P-1/Q)如果剩下的P个(1/P-1/Q)刚好可以组成Q-P个1/Q就OK 否则还得再分。
貌似很复杂。。后来你多写几个会发现其实把整个过程分开来看做两个单独的部分,分别切P块和Q块这样必然能够完成单独的任务,块数为P+Q,然后发现这样的切割过程会有重复的部分,那么拿P+Q-重复的部分就是可以同时满足两种情况且块数最少的答案,而进一步可以找到规律是重复的部分是GCD(P,Q),所以可以把答案划归成一个算式也就是:P+Q-GCD(P,Q),我的代码还分了是否能整除的情况后面发现其实可以不要o(╯□╰)o 上代码。
题意很明显了。
思路:找规律(AC了之后网上说是拓展欧几里得的变形o(╯□╰)o)。。。
怎么找:先P等分再Q等分呗,比如 2 3 先分成1/2,,1/2和1/3,1/3,1/3 然后再把大的(1/2)去分成1/6 1/3 1/6 1/3 ,发现O了4块,再看4 6 先分成1/4 1/4 1/4 1/4和1/6 1/6 1/6 1/6 1/6 1/6 ,然后把1/4 拆成1/12 1/6 1/12 1/6 1/12 1/6 1/12 1/6 又O了8块,再看3 7 分成1/3 1/3 1/3 和1/7 1/7 1/7 1/7 1/7 1/7 1/7 然后把1/3 拆成4/21 1/7 4/21 1/7 4/21 1/7 4/21 1/7发现1/7无法凑出,还少了4个 于是继续分把三个4/21都拿一个1/21出来组成一个1/7 剩下的自己又变成了1/7 刚好符合,这一下是9块。
然后我们假设1/P>1/Q,那么我们继续把1/P分解成P个1/Q和P个(1/P-1/Q)如果剩下的P个(1/P-1/Q)刚好可以组成Q-P个1/Q就OK 否则还得再分。
貌似很复杂。。后来你多写几个会发现其实把整个过程分开来看做两个单独的部分,分别切P块和Q块这样必然能够完成单独的任务,块数为P+Q,然后发现这样的切割过程会有重复的部分,那么拿P+Q-重复的部分就是可以同时满足两种情况且块数最少的答案,而进一步可以找到规律是重复的部分是GCD(P,Q),所以可以把答案划归成一个算式也就是:P+Q-GCD(P,Q),我的代码还分了是否能整除的情况后面发现其实可以不要o(╯□╰)o 上代码。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
int p,q;
while(cin>>p>>q)
{
if(p%q==0)
{
cout<<p<<endl;
}
else if(q%p==0)
{
cout<<q<<endl;
}
else {
cout<<p+q-gcd(p,q)<<endl;
}
}
return 0;
}