【GCD(最大公约数)】HDU1722-Cake

2023-12-15 22:38

本文主要是介绍【GCD(最大公约数)】HDU1722-Cake,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题目】

Cake

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


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块。
【解题思路】
解这道题主要难在想法,里面会用到一个欧几里得辗转相除法求最大公约的问题,实现起来并不难。问题就出在最终公式的推导。综合一些大神的结果,我总结的一个比较好理解的思路还是画图。
举个栗子,以输入6 9为例,我们来数实现每种情况的目的需要切的刀数。首先是6个人,由于蛋糕是圆的,根据这道题的特殊情况,我们下刀时需要从蛋糕圆心处下刀并向外切,即,沿着蛋糕的半径去切,不能沿直径。因此要把蛋糕分别分成6份和9份的刀数分别是6和9。
所以现在问题转化为,要切到最少的块数,该怎么切。由上面的分析,可以知道,要想块数最少,我们下刀的刀数要最少,也就是说,我们两次下刀时,尽量使下刀的痕迹重合越多越好,来看下面的图:
这张图中,被红线分割的是1/6的情况,被灰线分割的是1/9的情况,兰色则表示红线与灰线重合的线。图中所画的情况表示重合线最多的情况。可以看到有3条线重合。
可是为什么会是3条?
原因是,分割6条时,每条线占到1/6 , 9条时为1/9,所以灰线中间每隔两条线都会与红线重合一次,换句话来讲,就是因为3是6和9的最大公约数。
到这里,相信大家应该明白最少的刀数该怎么算了吧,两种情况的刀数相加,再减去想要刀数最少时重合的刀数数目,即 答案=(p+q-(p和q的最大公约数)) 。下面来看一下我的代码实现吧~
【代码】
#include__int64 GCD(__int64 a,__int64 b);
int main()
{
__int64 p,q;
while(scanf("%I64d%I64d",&p,&q)!=EOF)
printf("%I64d\n",q+p-GCD(p,q));
}
__int64 GCD(__int64 a,__int64 b)
{
if(a%b==0)
return b;
else
return GCD(b,a%b);
}
另外代码中的__int64相当于数字很大的int变量,用%I64d接收。

这篇关于【GCD(最大公约数)】HDU1722-Cake的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/498153

相关文章

CF629D Babaei and Birthday Cake

题意:给出N个半径,和高的圆柱,要求后面的体积比前面大的可以堆在前一个的上面,求最大的体积和。 dp[i]=max(dp[j])+v[i](j<i&&v[i]>v[j]); 离散化,线段树维护区间最大值 import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

js,找出两个数的最大公约数

/*比如说有要求a、b两个整数的最大公约数,a>b,那么我们先用a除以b,得到商8,余数r1:a÷b=q1…r1 我们当然也可以把上面这个式子改写成乘法式:a=b*q1+r1     如果r1=0,那么b就是a、b的最大公约数。 要是r1≠0,就继续除,用b除以r1,我们也可以有和上面一样的式子:b=r1*q2+r2    如果余数r2=0,那么r1就是所求的最大公约数。*/ fun

iOS——GCD再学习

GCD 使用GCD好处,具体如下: GCD 可用于多核的并行运算;GCD 会自动利用更多的 CPU 内核(比如双核、四核);GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程);程序员只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码。 任务与队列 概念 **任务:就是执行操作的意思,换句话说就是你在线程中执行的那段代码。**在 GCD 中是放在 block 中

GCD常用函数拾遗

目录 dispatch_block_t监听block执行结束dispatch_block_waitdispatch_block_notify 撤销block总结参考 这几天偶尔又回顾了下GCD的知识。之前我一直以为自己对于GCD已经大体有个整体掌握了,却发现仍还有一些知识点的遗漏。于是写在这里,算是对之前GCD常用函数文章的补充。 dispatch_block_t 在GCD中

环上k划分的和的gcd的最大值【gcd基本性质的利用】

今早看到的题,想了下会做了,但是觉得这题挺有意思的,于是打算写一下做法。本题利用了gcd的基本性质:更相减损法以及结合律,平时做gcd的题基本没用到过这两性质,而本题对这性质进行了充分利用。 思路: 首先我们考虑给一个序列,我们该怎么做。 令 fn=∑ni=1ai f_n=\sum_{i=1}^n a_i。 我们考虑序列的一个 k+1 k+1划分 fx1,fx2−fx1,fx3−fx2

猫猫学iOS(五十一)多线程网络之GCD下载合并图片_队列组的使用

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 合并图片(图片水印)第一种方法 效果 实现: 思路: 1.分别下载2张图片:大图片、LOGO 2.合并2张图片 3.显示到一个imageView身上 // 异步下载dispatch_async(dis

猫猫学iOS(五十)多线程网络之GCD简单介绍(任务,队列)

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents GCD简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方

iOS面试:GCD的队列(dispatch_queue_t)分哪两种类型?

在 iOS 开发中,Grand Central Dispatch (GCD) 提供了强大的并发执行任务的能力。dispatch_queue_t 是 GCD 中的一个重要对象,用于管理和调度要执行的任务。GCD 的队列主要可以分为两种类型: 1. 串行队列(Serial Queues) 串行队列确保在同一时间只执行一个任务。任务按照它们被添加的顺序逐个执行。这种队列适用于需要操作共享资源的场景,

GCD部分用法

1,用gcd延迟执行任务 如果我们需要某个方法在一段时间后执行,那么我们常常会调用这样的方法 - (void)viewDidLoad{     [super viewDidLoad];     [self performSelector:@selector(printString:) withObject:@"Grand Central Dispatch" afterDel