你好我是林森lsjs我的Github 地址sqyCoder (Qiyang) · GitHub以博文记录成长用心打磨代码与思维欢迎来到日耕一题今天这道是 2026 蓝桥杯省赛的 C 题纯思维题。抓住任意连续子数组这个强约束一、题目完整解读原题试题 C: 循环右移时间限制: 1.0s 内存限制: 256.0MB 本题总分10 分给定三个整数 N,X,Y。请计算有多少个长度为 N 的整数数组 A 满足以下条件数组 A 中的每个元素 A_i 都满足 X ≤ A_i ≤ Y对于数组 A 中的任意一个连续子数组对其进行一次循环右移操作得到的新子数组与原数组完全一致。循环右移对一个长度为 k 的连续子数组 [B₁,B₂,…,B_k] 执行一次循环右移操作是指将该子数组变换为 [B_k,B₁,B₂,…,B_{k-1}]即把最后一个元素移到最开头其余元素保持原有顺序依次向后顺延一位。输入格式第一行包含一个整数 T表示测试数据的组数。接下来的 T 行每行包含三个由空格隔开的整数 N,X,Y。输出格式对于每组测试数据输出一行包含一个整数表示满足条件的数组 A 的个数。拆解所有要求数组长度固定为 N每个元素取值在 [X, Y] 之间强约束所有连续子数组循环右移一次后必须和自身完全相同输出合法数组的总个数数据范围极大N、X、Y 均可达到 10¹⁸普通循环、数组模拟完全不可行坑N 是迷惑项最终结果和数组长度完全无关X 可能大于 Y此时没有合法元素答案为 0数值范围远超 int必须用 long 类型二、核心推导条件到底意味着什么很多人读完题第一反应是去想长数组的循环右移性质其实完全不用搞那么复杂。约束越强结论越极端—— 既然要求任意连续子数组都满足那我们从最小的子数组入手就能推出全局性质。1. 从最小子数组切入长度为 2 的情况我们随便取数组中任意两个相邻元素组成长度为 2 的连续子数组[a, b]。对它执行一次循环右移得到的结果是[b, a]。题目要求操作后与原数组完全一致也就是[b, a] [a, b]对应位置相等必然有a b。这说明什么数组中任意两个相邻元素都必须相等。相邻相等可以传递a₁a₂a₂a₃ → a₁a₃。以此类推整个数组所有元素都必须相等。2. 充分性验证全相等数组必然满足反过来如果一个数组所有元素都相等那它是否满足条件显然成立。任意取一个连续子数组里面每个元素都一样循环右移之后元素还是那些顺序怎么换都和原数组完全相同。3. 最终结论长度为 N 的数组满足条件当且仅当数组中所有元素都相等。因此问题直接简化为在 [X, Y] 范围内选一个数作为数组所有元素的值一共有多少种选法答案就是区间内整数的个数Y - X 1当 X ≤ Y 时如果 X Y答案为 0。划重点最终结果和 N 没有任何关系不管 N 是 1 还是 10¹⁸答案都一样。这是题目最大的迷惑项。三、易错坑点与数据范围说明坑 1被 N 带偏思路很多同学上来就盯着 N 想组合数、想排列算来算去越算越复杂。其实只要沉下心推一遍性质就会发现 N 完全没用读进来不用处理就行。坑 2忽略 X Y 的情况如果输入的 X 比 Y 大说明取值区间是空的合法元素个数为 0答案就是 0。直接写y - x 1会得到负数提交直接错。坑 3数据类型溢出题目里 X、Y 可以到 10¹⁸远超 int 的 21 亿上限必须用long类型存储和计算。Java 中输入的常量也要注意用 long 接收。四、完整可运行代码Javaimport java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int T sc.nextInt(); while (T-- 0) { // 注意全部用long类型N读进来但不需要使用 long N sc.nextLong(); long X sc.nextLong(); long Y sc.nextLong(); if (X Y) { System.out.println(0); } else { System.out.println(Y - X 1); } } sc.close(); } }代码核心逻辑只有一行判断加计算剩下的都是输入输出。哪怕 T 有 1000 组、数据到 10¹⁸也能瞬间算出结果。五、样例输入输出全复盘我们拿官方样例来验证一遍输入样例3 3 1 2 5 10 10 2 5 3逐组计算第一组N3X1Y2 → 区间内有 1、2 两个数 → 输出 2第二组N5X10Y10 → 只有 10 一个数 → 输出 1第三组N2X5Y3 → XY区间为空 → 输出 0输出样例2 1 0和预期完全一致。六、总结这道题是非常经典的「算法思维题」不考代码实现不考数据结构就考你能不能沉下心从基础条件推导性质不被题干的复杂描述吓住。核心思路遇到任意子数组都满足某性质先从最短的子数组入手推导全局约束验证充要性确保结论反过来也成立忽略迷惑参数抓住核心计算式注意数据范围和边界情况避免溢出和负数答案就到这里诸位共勉
【日耕一题】7. 循环右移(2026第17届蓝桥杯C++B组省赛 C 题)
发布时间:2026/6/24 5:21:14
你好我是林森lsjs我的Github 地址sqyCoder (Qiyang) · GitHub以博文记录成长用心打磨代码与思维欢迎来到日耕一题今天这道是 2026 蓝桥杯省赛的 C 题纯思维题。抓住任意连续子数组这个强约束一、题目完整解读原题试题 C: 循环右移时间限制: 1.0s 内存限制: 256.0MB 本题总分10 分给定三个整数 N,X,Y。请计算有多少个长度为 N 的整数数组 A 满足以下条件数组 A 中的每个元素 A_i 都满足 X ≤ A_i ≤ Y对于数组 A 中的任意一个连续子数组对其进行一次循环右移操作得到的新子数组与原数组完全一致。循环右移对一个长度为 k 的连续子数组 [B₁,B₂,…,B_k] 执行一次循环右移操作是指将该子数组变换为 [B_k,B₁,B₂,…,B_{k-1}]即把最后一个元素移到最开头其余元素保持原有顺序依次向后顺延一位。输入格式第一行包含一个整数 T表示测试数据的组数。接下来的 T 行每行包含三个由空格隔开的整数 N,X,Y。输出格式对于每组测试数据输出一行包含一个整数表示满足条件的数组 A 的个数。拆解所有要求数组长度固定为 N每个元素取值在 [X, Y] 之间强约束所有连续子数组循环右移一次后必须和自身完全相同输出合法数组的总个数数据范围极大N、X、Y 均可达到 10¹⁸普通循环、数组模拟完全不可行坑N 是迷惑项最终结果和数组长度完全无关X 可能大于 Y此时没有合法元素答案为 0数值范围远超 int必须用 long 类型二、核心推导条件到底意味着什么很多人读完题第一反应是去想长数组的循环右移性质其实完全不用搞那么复杂。约束越强结论越极端—— 既然要求任意连续子数组都满足那我们从最小的子数组入手就能推出全局性质。1. 从最小子数组切入长度为 2 的情况我们随便取数组中任意两个相邻元素组成长度为 2 的连续子数组[a, b]。对它执行一次循环右移得到的结果是[b, a]。题目要求操作后与原数组完全一致也就是[b, a] [a, b]对应位置相等必然有a b。这说明什么数组中任意两个相邻元素都必须相等。相邻相等可以传递a₁a₂a₂a₃ → a₁a₃。以此类推整个数组所有元素都必须相等。2. 充分性验证全相等数组必然满足反过来如果一个数组所有元素都相等那它是否满足条件显然成立。任意取一个连续子数组里面每个元素都一样循环右移之后元素还是那些顺序怎么换都和原数组完全相同。3. 最终结论长度为 N 的数组满足条件当且仅当数组中所有元素都相等。因此问题直接简化为在 [X, Y] 范围内选一个数作为数组所有元素的值一共有多少种选法答案就是区间内整数的个数Y - X 1当 X ≤ Y 时如果 X Y答案为 0。划重点最终结果和 N 没有任何关系不管 N 是 1 还是 10¹⁸答案都一样。这是题目最大的迷惑项。三、易错坑点与数据范围说明坑 1被 N 带偏思路很多同学上来就盯着 N 想组合数、想排列算来算去越算越复杂。其实只要沉下心推一遍性质就会发现 N 完全没用读进来不用处理就行。坑 2忽略 X Y 的情况如果输入的 X 比 Y 大说明取值区间是空的合法元素个数为 0答案就是 0。直接写y - x 1会得到负数提交直接错。坑 3数据类型溢出题目里 X、Y 可以到 10¹⁸远超 int 的 21 亿上限必须用long类型存储和计算。Java 中输入的常量也要注意用 long 接收。四、完整可运行代码Javaimport java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int T sc.nextInt(); while (T-- 0) { // 注意全部用long类型N读进来但不需要使用 long N sc.nextLong(); long X sc.nextLong(); long Y sc.nextLong(); if (X Y) { System.out.println(0); } else { System.out.println(Y - X 1); } } sc.close(); } }代码核心逻辑只有一行判断加计算剩下的都是输入输出。哪怕 T 有 1000 组、数据到 10¹⁸也能瞬间算出结果。五、样例输入输出全复盘我们拿官方样例来验证一遍输入样例3 3 1 2 5 10 10 2 5 3逐组计算第一组N3X1Y2 → 区间内有 1、2 两个数 → 输出 2第二组N5X10Y10 → 只有 10 一个数 → 输出 1第三组N2X5Y3 → XY区间为空 → 输出 0输出样例2 1 0和预期完全一致。六、总结这道题是非常经典的「算法思维题」不考代码实现不考数据结构就考你能不能沉下心从基础条件推导性质不被题干的复杂描述吓住。核心思路遇到任意子数组都满足某性质先从最短的子数组入手推导全局约束验证充要性确保结论反过来也成立忽略迷惑参数抓住核心计算式注意数据范围和边界情况避免溢出和负数答案就到这里诸位共勉