1024 (程序员节) 欢乐赛 T1 分火腿 (思路题)


题面:

分火腿

hdogs.pas/.c/.cpp

时间限制:1s;内存限制 64MB

题目描述:

小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿。为了省事,小月言想切最少的刀数,使这n根火腿分成均等的m份。请问最少要切几刀?

输入描述:

第一行一个整数T,表示有T组数据。

接下来T组数据,每组共一行,有两个数字nm

输出描述:

每组数据一行,输出最少要切的刀数。

样例输入:

2

2 6

6 2

样例输出:

4

0

数据范围:

100%的数据保证T<=1000n,m<=2147483647

  不得不说,这道题,我确实没看懂……只有特判一下,输出0骗分滚粗QAQ

  试(事)♂后,才发现其实超级简单啊……

  思路如下:

  我们把这些火腿看成是一根大火腿,不过一些位置已经被切过了。

  根据题意,我们要把这根大火腿平均切。既然如此,那我们每次切的位置一定是确定的,并且切了m-1刀。

  这样,我们需要做的就是判断一下那些位置已经被切过了,不需要我们再切,再将这些位置有几个记录一下,最后减去就好了。

  可以想象,那些需要切的位置与已经切好的位置重合的条件就是此时需要切的位置需要切的长度已经切好的长度的位置的最小公倍数的整数倍。(需要切的长度就是平分后的每个人得到长度,已经切好的长度就是每根火腿的长度)

  设每根火腿长度为1,则平分后每个人得到的长度是n/m(n根火腿,m个人),设最小公倍数为k。那么1与n/m的最小公倍数k=(n*m/gcd(n,m))/m=n/gcd(n,m)。(这是分数的最大质因子求法https://zhidao.baidu.com/struct/questions/fedf07371bcd1c35ac8977b0.html那么重合被切的位置就有(n/k)个,也就是(gcd(n,m)-1)个。(注意:这里减一的原因是我们把最后一个也算进去了,也就是这根大火腿的尾端。被算进去的原因也很简单,尾端是一定能被我们恰好切的,因为n一定是1和(n/m)的公倍数。至于为什么首端为什么没有被算进去是因为0不是1和(n/m)的公倍数。)

  那么只要输出m-1-(gcd(n,m)-1)=m-gcd(n,m)就好啦~

  代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,T;
template<class T>inline void read(T &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9'){ f|=(ch=='-'); ch=getchar(); }
    while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    x=f ? -x:x;
    return;
}
inline int Gcd(int x,int y)
{
    int c=x%y;
    while(c!=0)
    {
        x=y;
        y=c;
        c=x%y;
    }
    return y;
}
int main()
{
//    freopen("hdogs.in","r",stdin);
//    freopen("hdogs.out","w",stdout);
    read(T);
    while(T--)
    {
        read(n);read(m);
        if(n%m==0)printf("0\n");//特判
        else printf("%d\n",m-Gcd(n,m));
    }
//    fclose(stdin);
//    fclose(stdout);
    return 0;
}

优质内容筛选与推荐>>
1、【转】org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be res
2、关于asp.net网站下aux路径访问问题
3、简单的位运算入门,适合不知道什么是位运算的新手看看!
4、Photoshop小技巧集锦八十条
5、static和const关键字的使用


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号