备战GESP三级,手上正好刷到题库里这道“4126:分糖果”。老实说,我第一次看到题目名字时没太当回事,觉得“分糖果”这种生活化场景在小学奥数里都见多了,三级能考出什么花来?等真正把题读完、又在草稿纸上画了好几轮分配过程,才发现它没那么简单。这题不是让你真的拿for循环一颗一颗去发糖,而是考察你能不能把一个“循环过程”抽象成数学表达式。很多学生在考场上用了最直接的模拟写法,样例能过,但数据一大就超时,最后只能对着时间限制干瞪眼。
这道题来自GESP 2025年6月的三级场次,也就是大家常说的“2506”场。对准备9月场次的同学来说,这题几乎是最好的风向标:它不考偏门语法,不考复杂数据结构,只考两件事——你读题的时候能不能抓住“围成一圈”这个循环条件,以及你能不能写出不依赖循环的取模写法。下面我把这题的完整思路、推导过程、代码实现和考场上的各种坑一个一个拆开说,最后再顺带聊聊怎么把这道题的思维迁移到同场次的“小猫分鱼”和类似的模拟题上。
1. 先说结论:这道“分糖果”究竟考什么
1.1 真题长什么样
网上关于这道题的回忆版有好几个,表述上略有出入,但去掉生活化包装后,核心模型基本一致:有n个小朋友围成一圈,按顺时针方向编号为1到n,老师手里有m颗糖,从1号小朋友开始,按照编号顺序轮流发糖,每次给当前这位小朋友一颗,问第m颗糖最后被谁拿到。
这个就是题目的骨架。有的版本会说成“老师绕着圈发糖,发完一圈接着下一圈”,也有版本把它包装成“每个小朋友每次拿一颗,拿完一轮继续下一轮”,不管外面套了什么故事,你只要在纸上画一个圈、标上编号,就会发现它其实就是一个“循环访问数组下标”的问题。
为什么说这题适合拿来备考?因为它在GESP三级大纲里正好卡在一个非常关键的位置:你已经学过for循环、while循环,但还没系统接触算法复杂度优化。命题人不会直接考你“时间复杂度”这个概念,而是通过数据范围让你自己体会到“循环次数过多会挂”,这种考察方式比直接背概念更能筛出真正理解程序执行效率的学生。
1.2 题目包装下的三个核心考点
第一,循环下标的处理。围成一圈意味着1号后面跟着2号,n号后面又回到1号,下标不是简单递增,而是需要“绕回”。这是编程里面非常经典的取模场景,也是这题最大的考点。
第二,数据规模的敏感度。m可能是很大的数,如果你老老实实模拟发m颗糖,时间复杂度是O(m)。当m达到10^18级别,任何编译器都救不了你,程序会在循环里跑到天荒地老。把自己从“模拟每一步”的惯性思维中拉出来,是三级考试要考察的分水岭。
第三,边界条件的严谨性。题目是从1号开始发,第1颗给1号,那第m颗给谁,公式写出来以后还要不要考虑整除的情况?如果你用的是0基编号还是1基编号,最终输出要不要加1?这些细节不处理好,公式就算背下来也照样丢分。
1.3 谁适合看这篇解析
如果你正准备GESP三级,或者刚学完循环和数组,想找一些“有点思维量但又不超纲”的模拟题练手,这篇解析很合适。我会从最笨的暴力模拟开始推,再一步步化简到公式,这样就算你之前没接触过取模运算,也能跟着理解。已经有基础的同学可以直接跳到第三部分的代码实现和第四部分的坑点总结。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
