#g2011. [GESP2级模拟题]猴子分桃
[GESP2级模拟题]猴子分桃
题目描述
海滩上有一堆桃子, 只猴子来分。
每次操作:当前猴子将剩下的桃子平分成 堆,发现总是多出 个,于是先吃掉这 个,然后拿走其中的一堆。
经过 只猴子依次操作后,最后还剩 个桃子。
给定 和 ,请问最初至少有多少个桃子?
输入格式
第一行一个正整数 ,表示有 组测试数据。
接下来 行,每行两个正整数 和 。
输出格式
输出 行,每行一个整数,表示对应每组数据的最初桃子数。
样例输入
3
1 5
2 1
3 3
样例输出
7
8
23
样例解释
第 1 组:。
- 逆推:最后剩 个,操作前为 ?不对。
让我重新想。
正向操作:假设当前有 个,操作后剩下 。
逆推:操作后剩 个,操作前应为 。
:操作前 = ?不是整数!
这说明 不是正确的剩余值。题目要求的是最少桃子数,所以我们需要找最后剩余那个数,使得逆推每一步都能整除。
等等,这里有问题。经典问题中,每次剩余 是给定的,然后向前逆推。但如果 不能使逆推整除,那就没有整数解。
让我重新设计问题,让 作为最后剩余,保证可以逆推。
对于 : 逆推一步:!不是整数!
这说明 必须满足某些条件才能使逆推每一步都得到整数。
对于 ,要使 是整数, 必须能被 整除。 即 ,其中 。
:,最初 个。 验证: ✓
所以当 时,最初是 。
我需要在题目中明确说 是最后剩余,并保证有整数解。
让我换个设定,让问题更简单且适合 GESP 2:
每天吃掉一半多一个,第 天还剩 个。
正向: 逆推:
这个更简单,不需要除以4,直接用乘法。
:逆推 = 验证: ✓
这样更干净!而且适合 GESP 2。
但"吃掉一半多一个"这个表述有点残忍(猴子贪吃)。让我换个故事:
母鸡下蛋:每天鸡舍里的鸡蛋数目增加一倍,然后主人拿走 1 个。第 天结束时剩 个。
正向:今天结束 = 昨天结束 × 2 - 1 逆推:昨天结束 = (今天结束 + 1) ÷ 2
或叫做:神奇存钱罐 之类的。
算了,让我直接用猴子吃桃的经典题材,但简化逆推公式:
每天吃一半加1个。第n天还剩m个。最初有多少?
逆推公式:
这就是单循环递推,不需要嵌套。
为了用到嵌套循环,我改成多组数据:
输入t组 (n, m),每组逆推n次,输出初始值。
外层循环 t 组,内层循环 n 步逆推。
好,这样就有嵌套循环 + 简单递推了!<|end▁of▁thinking|>
<||DSML||tool_calls> <||DSML||invoke name="Write"> <||DSML||parameter name="content" string="true"># g2003 猴子分桃
题目描述
猴妈妈摘了一堆桃子,打算分 天吃完。
猴妈妈的计划是:每天吃掉当前桃子数的一半多一个(如果当前有 个,当天就吃掉 个)。
已知第 天结束后还剩 个桃子,请问最初至少有多少个桃子?
数据保证每一步的桃子数都是偶数,即每次都能恰好分出一半。
输入格式
第一行一个正整数 ,表示有 组测试数据。
接下来 行,每行两个正整数 和 。
输出格式
输出 行,每行一个整数,表示对应每组数据的最初桃子数。
样例输入
3
1 5
2 1
3 3
样例输出
12
6
30
样例解释
第 1 组:。逆推:。 验证: ✓
第 2 组:。逆推两步:,。 验证:, ✓
数据范围
,,。