HDU1722 数学题?

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
  
  
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块。
 

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 上代码。
#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;
}


 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值