2026年3月14日GESP五级现场直击
hi !这里是箫竺时隔n月我终于更新啦这次五级出的是真仓促光凭选择题与判断题用一摸一样的体面代码就可以看出来那这么简单的五级还有那个小伙伴没过呢让我康康那么本期blog,就让我为您拆解202603五级的编程T1和T2吧目录T1 有限不循环小数题目大意上思路实现T2 什么名我忘记了题目大意思路实现后记前期叠甲本期内容仅为个人做法讲究快速和不准确读者们如果有更好的想法可以提在评论区那让我们开始吧T1 有限不循环小数第一题体面不能说很有意思只能说不输数学课本题目大意令 $1/a$ 为有限的、不循环的小数称其为终止数现给出$ l,r$问本区间内有多少个$终止数$上思路首先什么是终止数就是说像$1/2$、 $1/4$ 这样可以被“除完全”的小数称终止数那我们用中学时期学过的特殊化来找规律问 1~11之间有多少个终止数没错5个分别为2 4 5 8 10那他们有什么共同点根据唯一分解定理他们可以如下分解2 → 2 4 → 2 * 2 5 → 5 8 → 2 * 2 * 2 10 → 2 * 5读者们看出来了吗他们都含有2 和 5那我们就可以挨个分解若含有杂数就判作非终止数思路有了那怎么实现呢实现首先暴力方法我们可以直接对每个数进行拆分像这样vectorint init(int n){ vector int p; if(n % 2 0){ p.push_back(2); while(n % 2 0){ n / 2; } } for(int i 3;i*i n;i2){ if(n % i 0){ p.push_back(i); while(n % i 0){ n / i; } } } if(n 2) p.push_back(n); return p; }接着对每个数的质因子进行判断这道题就做粗来了AC代码#includeiostream #includealgorithm #includevector #includecmath #define int long long using namespace std; int l,r,ans; vectorint init(int n){ vector int p; if(n % 2 0){ p.push_back(2); while(n % 2 0){ n / 2; } } for(int i 3;i*i n;i2){ if(n % i 0){ p.push_back(i); while(n % i 0){ n / i; } } } if(n 2) p.push_back(n); return p; } signed main(){ cin l r; for(int i l;i r;i){ vector int p init(i);bool flag true; for(int j 0;j p.size();j){ if(p[j] ! 2 p[j] ! 5) flag false; } if(flag){ ans; } } cout ans; return 0; }但这也太长了吧那我们可以对其进行精简。其实长的重点其实是判断和分解身首分家那我可以进行合并像这样bool init(int n){ if(n % 2 0){ while(n % 2 0){ n / 2; } } for(int i 3;i*i n;i2){ if(n % i 0 i ! 5){ return false; } } if(n 2 n ! 5) return false; return true; }是不是短了很多呢那AC代码也会很短像这样#includeiostream #includealgorithm #includevector #includecmath #define int long long using namespace std; int l,r,ans; bool init(int n){ if(n % 2 0){ while(n % 2 0){ n / 2; } } for(int i 3;i*i n;i2){ if(n % i 0 i ! 5){ return false; } } if(n 2 n ! 5) return false; return true; } signed main(){ cin l r; for(int i l;i r;i){ if(init(i)) ans; } cout ans; return 0; }T2 什么名我忘记了这个题面太直白了不像CCF的实力啊题目大意现有ab数组保证数组内个数不相等问a b 数组出现的相同数字有多少不知道读者大大们看没看懂但箫竺只能背到这了思路其实思路很好想暴力进行合并就好了但这里箫竺需要提醒一下各位。进行暴力枚举真的过不了究其原因是因为不存在的数字要遍历一遍B数组找到了的数字还要继续遍历才这么多的解决方法代码见实现我们先将A,B数组排个序因为题目中并未体现位置的重要性所以我们sort排一下就好接着对暴力代码进行一点优化首先排过序后a数组内找到过的数字肯定比下一个要找的数字小也对应B数组内的下一个数A2 3 4B1 2 3 5 7我们找了2找到后3A内的一定在B数组内2 的下标 的后面抱歉这是我能想到的最容易理解的说法了所以我们设一个BIT存这样的下标找到了就break接着我们优化非存在数字的遍历排序后A内的某数一定不会出现在B内的大于此数字的数字后面所以如果下一个数字比目标数字大但还没有找到相同数字我们就跳出循环由此AC代码诞生#includeiostream #includealgorithm #includecmath #define int long long using namespace std; int n,m; int a[100001],b[100001]; signed main(){ cin n m; for(int i 1;i n;i){ cin a[i]; } for(int i 1;i m;i){ cin b[i]; } sort(a1,a1n);sort(b1,b1m); int ans 0,bit 1; for(int i 1;i n;i){ for(int j bit;j m;j){ if(a[i] b[j]){ ans; bit j; break; } if(b[i1] a[i]){ break; } } } cout ans; return 0; }后记我认为这次五级很简单出题过于仓促。在这里祝大家逢考必过如果有看不懂的内容请私信博主