1. 蓝桥杯填空题的得分逻辑先搞清楚它在考什么1.1 填空题在整个赛制里处在什么位置打过蓝桥杯的人都知道卷子一翻开前几道就是填空题。近几年省赛和国赛的常见编排是卷首放两到三道填空题单题分值通常在5分到10分之间合计十几分到二十分不等具体分值以当年赛题为准。剩下的编程题才是大头但填空题的意义不只是那点分数它决定了你开场的心态和后面题目的时间余量。我见过太多选手编程题做得七七八八结果翻开卷子第一题填空花了二十五分钟最后编程题没时间调。也见过相反的情况填空两道题五分钟解决心态稳得不行后面越做越顺。所以十秒快速做出填空题这个说法重点不在十秒这三个字玄学而在于你有没有一套被反复验证过的识别流和工具流。看到题目脑子里立刻弹出这是日期类这是枚举类这是大数类然后手或者代码跟上答案出来。还有一点常被忽略填空题不判过程只认最终提交的那个答案整数就是整数字符串就是字符串。这意味着你完全可以用本地编译器、计算器、表格软件、Python解释器去算甚至手推公式——只要答案对就行。这个规则本身就是快速解法存在的土壤。1.2 填空题和编程题的本质差异理解差异是提速的前提。编程题要求你在时间与空间限制内通过所有测试点考的是完整实现能力填空题考的是得到一个确定结果考的是推理效率。这两件事的思维方式完全不同。编程题里你不敢用三重循环枚举一亿次但在填空题里如果本地三秒钟能跑出结果你完全可以这么干。编程题里你得考虑输入输出格式、多组数据、边界情况填空题里这些全都不用管。所以很多在编程题上被卡住的人填空反而做得飞快——因为他敢用笨办法。反过来也有选手习惯性地想在填空题里写优雅算法结果推导半小时不如直接枚举来得快。提示填空题的容忍度比分界线更宽赛前就要给自己建立能算出来就是好方法的心态不要为了优雅牺牲时间。1.3 十秒出答案拆开看是什么我个人把十秒理解成十秒之内完成三件事的判断第一这题的答案是什么类型整数、字符串、还是带小数第二用哪种手段拿到它手推、心算、写一小段代码第三大概会跑多久要不要先放着换下一题。这三件事判断完了真正执行可能是一分钟也可能是一毫秒但你不会在错误的路径上浪费时间。这个判断能力不是天生的是靠题型积累堆出来的。下面这几类填空基本覆盖了历年卷面上能见到的绝大多数我把识别特征和解法路径一起写出来你可以直接抄作业。2. 四类高频填空题的识别特征与秒解路径2.1 日期与日历类闰年和模七是两个抓手这类题出现频率极高典型问法有某年某月某日是星期几从某天起再过 N 天是哪一天某段日期区间内有多少个满足条件的日子。做题的抓手就两个闰年规则和星期对7取模。闰年的判断规则是能被4整除但不能被100整除或者能被400整除。写成条件就是(y % 4 0 y % 100 ! 0) || (y % 400 0)。星期计算可以用基姆拉尔森公式也可以直接借助工具。我个人最常用的办法是用 Python 的 datetime 模块一行出结果import datetime d datetime.date(2024, 4, 13) print(d.weekday()) # 0 是周一6 是周日 print(d.strftime(%A))如果是问某天加 N 天直接用timedeltaimport datetime d datetime.date(2024, 1, 1) datetime.timedelta(days1000) print(d)为什么要用代码而不是手算因为手算路上有闰年、月份天数、星期起点这几处坑任何一处错整个答案就废了。代码只错在输入参数上而参数是你肉眼可见的、能复读确认的东西。这是典型的用工具的确定性换掉人脑的不确定性。2.2 计数与枚举类三重循环不丢人有多少个数满足条件最多有多少种方案第 N 个满足条件的数是多少这类题的通行解法就是暴力枚举。很多选手不敢写多重循环觉得不优雅。我得说一句填空题里本地跑得动的枚举就是最优解。举个常见形态求某个范围内各位数字满足特定关系的数的个数。写三层循环枚举每一位判断条件计数打印十行代码解决。哪怕是六位数、七位数的范围本地跑起来也就几毫秒到几百毫秒。count 0 for n in range(1000, 10000): digits [int(c) for c in str(n)] if sum(digits) 20 and max(digits) - min(digits) 3: count 1 print(count)这里有个经验点写枚举代码时先说清楚范围边界是否包含也就是左闭右闭还是左开右闭。蓝桥杯的题干有时候写1 到 100 之间这个之间是含不含端点得看题目的语境和你对答案数量级的直觉。如果枚举出来结果很怪比如刚好比某个整数多1或者少1回头检查端点。2.3 数学推导类能用公式就别写循环有些填空题题干里给的数特别大比如求 1 到 10 的 9 次方之和某个大数除以 1000000007 的余数。这时候循环枚举是跑不完的必须上公式或快速幂。常见公式要背等差数列求和n * (a1 an) / 2平方和n*(n1)*(2n1)/6立方和(n*(n1)/2)^2。组合数可以用阶乘或者杨辉三角递推。快速幂取模的代码模板如下def qpow(base, exp, mod): res 1 base % mod while exp: if exp 1: res res * base % mod base base * base % mod exp 1 return res print(qpow(2, 1000, 1000000007))推导类题的实操心得是先在草稿纸上把递推关系写出来能闭式就闭式不能闭式再考虑矩阵快速幂或者动态规划。蓝桥杯填空不会把数论推到竞赛数学那么深但求和 取模这个组合年年都有。2.4 大数与精度类别跟溢出较劲这类题的识别特征非常明显阶乘、幂次、非常大的和。比如100 的阶乘末尾有多少个零2 的 1000 次方的各位数字之和。用int或者long long硬算基本必溢出。Java 组用BigIntegerPython 组的int本身就是任意精度C/C 组要么手写高精度要么转成字符串运算。Python 在这类题上优势极大n 100 fact 1 for i in range(1, n 1): fact * i print(fact) print(sum(int(c) for c in str(fact)))Java 的写法import java.math.BigInteger; public class Main { public static void main(String[] args) { BigInteger f BigInteger.ONE; for (int i 2; i 100; i) { f f.multiply(BigInteger.valueOf(i)); } System.out.println(f); int sum 0; for (char c : f.toString().toCharArray()) { sum c - 0; } System.out.println(sum); } }C/C 组如果遇到大数我会建议直接在草稿里换语言赛前准备好一个能跑的 Python 环境填空题用 Python 算编程题用熟悉的语言写。规则没禁止这就是填空题的便利。2.5 思维转化类蚂蚁感冒那种等效替换有一道在圈子里流传很广的题叫蚂蚁感冒问的是感冒蚂蚁最终会传染多少只。它的关键洞察是两只蚂蚁相遇后各自掉头等价于两只蚂蚁直接穿过彼此继续前进数量上完全一样。这个转化一出来问题就从模拟碰撞变成了统计位置关系复杂度瞬间掉下来。这类题在填空题里也不少。看着像要模拟其实要转化。判断方法是如果模拟的状态量太大、步骤太长就该停下来想有没有等价简化。等效替换、对称性、不变量这三样是思维题的常用武器。练这类题的收益不只是填空编程题里的省时也会用到。3. 十秒速解的完整操作流程3.1 第一步先读答案要求再读题干很多人题都不读完就开始算这是最容易翻车的习惯。我的固定动作是先扫一眼题目最后一行看它要的答案格式。是要一个整数还是一个字符串有没有说明结果是一个几位数。这个信息价值极高。如果题目提示结果是一个三位数而你算出来五位数说明模型错了如果要求填字符串你要注意大小写和前导零如果要求精确到小数若干位你得控制输出格式。先知道交付物长什么样再决定怎么生产它这是工程思维。3.2 第二步用三个问题决定手算还是写码我给自己定过一个简单判断表实测很好用判断维度倾向手算/心算倾向写代码搜索空间几十次以内上千次以上中间步骤3 步以内需要循环或递推出错代价可以反推校验一旦错难定位数值范围小整数涉及大数、幂次状态变化静态计算有模拟、有过程填表逻辑很简单只要涉及大量重复操作或者数值超出常规整型直接写代码只要三步之内能推出来手算反而更快因为省去了开编辑器、写、跑、看结果的时间。中间地带比如几十次枚举就看心情我个人会写代码因为手算容易在第四五次的时候走神。3.3 第三步赛前把这四段模板刻进肌肉记忆速度的核心是不需要临时想怎么写。赛前我会准备好几个片段闭着眼睛也能敲出来日期计算Python datetime 或 Java LocalDate大数阶乘与各位和Python 一行循环暴力枚举多层 for 条件判断 计数快速幂取模与组合数真正比赛时你只需要改改参数答案就出来了。这就是十秒的现实版本——不是十秒想出算法而是十秒调出模板。提示模板代码要在赛前至少手敲五遍以上保证不看资料能默写。比赛现场查语法是最浪费时间的行为之一。3.4 第四步答案校验三连别让手滑毁掉一题算完不代表结束我坚持做三步校验。第一是数量级校验跟题目的位数提示对一对或者用另一种方法估一个量级。第二是边界校验把范围的小端和大端代进去看看结果合不合理。第三是末位或奇偶校验很多计数题的答案有奇偶规律或者末尾数字规律能反查一部分错误。举个具体的例子。如果一道题枚举出来是 2023而你手算一个大致的期望值是 2000 左右那基本合理如果你算出来 20230明显多了一位就要回头查循环边界。校验花不了二十秒但能救回一整道题的分。4. 环境与工具把 IDE 改造成填空题计算器4.1 Java 组的速算配置Java B 组的选手最常遇到的问题是启动慢、写类烦。我的做法是赛前在本地 IDE 里建一个空白工程里面预置好一个Main类导入常用的java.math.BigInteger、java.time.LocalDate、java.util。比赛时直接改main方法里的逻辑跑完看控制台。import java.math.BigInteger; import java.time.LocalDate; public class Main { public static void main(String[] args) { LocalDate d LocalDate.of(2024, 1, 1).plusDays(1000); System.out.println(d); System.out.println(BigInteger.valueOf(2).pow(100)); } }这里有个细节值得说Java 的long上限约 9.22×10^18超过这个范围就得用BigInteger。很多人栽在以为 long 够用上。判断方法是如果你看到题干里出现 10 的 9 次方以上的乘法或者阶乘直接上BigInteger不要犹豫。4.2 Python 组的一行流优势Python 组做填空是真的爽。日期、大数、组合数、字符串处理几乎都能一行到几行搞定。itertools里的permutations、combinations能省掉大量手写递归from itertools import permutations cnt 0 for p in permutations(range(1, 10)): if p[0] p[1] and p[1] p[2]: cnt 1 print(cnt)要提醒的是permutations在元素多的时候会爆内存和爆时间9 个元素是 36 万种排列还扛得住10 个以上就要斟酌。别写出一段跑十分钟的代码赛场上每一秒都金贵。4.3 C/C 组的溢出防线C/C 组在填空上的最大敌人是溢出和数组越界。我的建议是枚举计数统一用long long涉及更大数值时直接转 Python 或者手写高精度。另外如果一个枚举因为剪枝写复杂了容易越界就干脆别剪枝让循环老老实实跑。#include bits/stdc.h using namespace std; int main() { long long cnt 0; for (long long n 1000; n 9999; n) { int s 0; long long t n; while (t) { s t % 10; t / 10; } if (s 20) cnt; } cout cnt endl; return 0; }long long的范围是约 -9.22×10^18 到 9.22×10^18记住这个数字能避免很多明明逻辑对结果却是负数的谜案。4.4 单片机与嵌入式方向客观题是另一套打法搜蓝桥杯的人里有一大群是单片机和嵌入式方向的这两类比赛的一阶段或者国赛里会有客观题题型和算法填空完全不同。它们考的是知识点记忆和概念辨析比如寄存器配置、中断优先级、定时器模式、通信协议时序、常见电路常识。这类题提不了速只能靠平时的知识清单。我自己的复习方式是做一张对照表把常考模块GPIO、定时器、串口、AD/DA、中断、看门狗、总线协议各自的核心配置项、常见陷阱整理成一页纸考前反复看。这跟算法填空的模板记忆是一个道理——把需要临场思考的东西提前压缩成能直接调用的知识块。5. 实战踩坑记录与问题速查5.1 溢出错最隐蔽也最常见溢出的可怕之处在于它不报错只是安静地给你一个错误的数。判断标准很简单看一眼数字范围。两数相乘超过 21 亿左右就超出int超过 9.22×10^18 就超出long long。另外取模题要警惕先算后取模的顺序每一步乘法后立刻取模别等到最后否则中间结果照样溢出。5.2 精度错浮点数不能直接比大小涉及浮点的填空题比如求某个面积或者平均值不要用比较浮点数要用误差范围。Python 里可以用Decimal或者控制输出格式。如果题目要求保留几位小数注意四舍五入的规则有时候需要0.0000001再格式化处理掉二进制表示带来的尾巴误差。5.3 提交格式错空格、大小写、前导零这是最冤的一类失分。填空题要求填一个字符串时字符串里有没有空格、大写还是小写、是不是固定长度带前导零都要严格按题目说明来。我吃过一次亏答案多了一个空格直接判错。现在的习惯是提交前把答案复制出来用眼扫一遍首尾再去点提交。5.4 常见问题速查表症状可能原因排查动作结果明显多一位循环边界多算了一轮检查range或for的端点结果为负数整型溢出换long long或大数类型答案比预期大很多重复计数检查去重逻辑或嵌套顺序日期差一天端点包含关系搞错确认从某天起是否含当天字符串判错大小写/空格/前导零逐字符对照题目要求代码跑太久搜索空间过大换数学方法或加剪枝5.5 时间分配填空别超过总时长的两成我给自己定的规矩是填空题总用时不超过整场比赛的百分之十五到二十。两道填空如果十分钟还没头绪先跳过去做编程题最后的空档再回来。原因是填空题的分数性价比虽高但它的卡住往往是无底洞式的越陷越深。先保住能拿的分再回来收尾这个策略帮我救回过好几次比赛。我个人在实际操作中的体会是填空题真正练的不是算法水平而是路径选择和模板储备。同一道题有人十分钟推出结果有人三十秒调出模板跑出答案差距就在赛前有没有把常见题型沉淀成条件反射。平时刷真题的时候别只满足于做对回头想想这题能不能三十秒解决我当时为什么绕了远路把绕路的经验记下来下一次就是十秒。
