- 博客(95)
- 收藏
- 关注
原创 STL专项:priority_queue 优先队列(堆)
也叫"",仅维护,可以在较小的时间复杂度内获取某个元素集合的最大或最小值优先队列常用于等问题或算法中,应用非常广泛。
2025-12-28 18:47:01
631
原创 STL专项:vector 变长数组
以下内容为学习过程中所记录的笔记万能头文件 / 预编译头文件,它的本质是包含了 C++ 标准库中几乎所有常用的头文件(比如输入输出、字符串、容器、算法、数学函数等)使用std命名空间,在代码中可以直接使用标准库中的标识符(如函数、类、变量等),无需额外添加 std:: 前缀。
2025-12-28 10:55:31
946
原创 xtuoj 字符串计数
发现问题:暴力枚举O(n²)超时 → 核心痛点是“逐个计算字符对”↓拆解问题:只有相同字符的(i,j)对有贡献 → 按字符分组计算↓找规律:对单个字符的位置列表,每新增一个位置p,其贡献可通过“已出现次数×(p+1) - 已出现位置和”批量计算↓抽象公式:贡献 = cnt*(p+1) - sum_pos(cnt是已出现次数,sum_pos是已出现位置和)↓落地实现:用数组(哈希表)记录每个字符的cnt和sum_pos,遍历字符串一次完成计算abcaba。
2025-12-14 23:15:49
683
1
原创 xtuoj Prime Twins
核心思想:用筛法预处理素数前缀和快速查询,将多次查询的时间复杂度从 O (n) 降为 O(1);关键逻辑:孪生素数对(x, x+2)的统计转化为对 x 的范围判断,再通过前缀和差值计算区间数量;效率优势:预处理仅需 O (N log log N) 时间,后续每个查询都是 O (1),适合大数据范围和多组查询场景。
2025-12-04 22:57:36
346
原创 xtuoj 哈希
①:用埃氏筛法生成足够大范围内的所有素数(按升序排列),为后续查找做准备;②:基于鸽巢原理,直接定位到第一个≥n/2 的素数(sz<n/2 时必然不满足要求,无需校验)③。
2025-12-04 21:36:16
260
原创 概率论与数理统计:期末复习梳理
∅∅∅ —— 不可能事件ΩΩΩ —— 必然事件A∩B=AB=∅A∩B = AB = ∅A∩B=AB=∅P(A‾)=1−P(A)P(\overline{A})=1-P(A)P(A)=1−P(A)P(AUB)=P(A)+P(B)−P(AB)P(AUB) = P(A) + P(B) - P(AB)P(AUB)=P(A)+P(B)−P(AB)P(AUBUC)=P(A)+P(B)+P(C)−P(AB)−P(AC)−P(BC)+P(ABC)P(AUBUC) =P(A) + P(B) + P(C) - P(AB) -
2025-12-04 14:29:41
530
原创 xtuoj 素数个数
(10亿):太大,不能筛整个1到R(100万):区间长度有限,可以存下:需要高效处理:任何一个合数 n 必有一个质因数 p ≤ √n:区间 [L, R] 中的合数,必有一个质因数 ≤ √R:R=1000000000(10亿)√R ≈ 31623只需要用到 ≤31623 的素数去判断区间内的数:O(√R log log √R) ≈ O(31623) 很小j - L:将[L, R]映射到数组[0, R-L]:找到第一个≤L的p倍数跳过p本身:避免把区间内的素数标记为合数。
2025-12-03 23:14:06
864
原创 xtuoj 素数字符串
这里我用线性筛然后答案一直错误,可能是我筛的范围没把控到位,主要是这里是用素数转成字符串,然后再去填充,给的是长度的范围。所以我后来直接用的试除法,当然利用了一下偶数中只有2是质数,然后生成素数序列,最后利用前缀和统计出0-9各个数字各个长度出现次数。如何生成素数序列,char temp[20],sprintf(temp,"%d",i),itempsprintftemp"%d"iitemp"123"'\0'然后将temp里面的字符依次存入素数串字符数组中。
2025-12-03 22:31:55
357
原创 xtuoj Interprime
prev + iavg接下来就是利用这个特性编写代码了。首先用先计算1e6+100以内的素数,多算一点避免漏掉一些情况,比如说两个相邻的素数刚好有个在1e6左边,还有一个在右边一点,然后平均值还是在1e6内,那这样你在右边一点的那个素数也能考虑到。接着就是定义一个存左边的奇质数,,每次取出一个素数,然后取平均值,判断其如果不是素数而且在范围内,那个这个平均值就是满足要求的内部素数,然后再把prev设置为当前的primes[i],相当于向右移动了一个单位。这里注意一点我们的循环条件应该设置为。
2025-12-03 20:07:14
350
1
原创 xtuoj D_Prime
首先写一个判断质数的函数 is_Prime,这里利用,其余都是合数,进行优化。然后根据 D_Prime 的定义,即。这里扩展一下,由于p是质数,所以p的因子只有1和p,q是质数,q的因子只有1和q,我的想法是p从2到sqrt(n),然后q=n/p,一直寻找,如果满足p!=q,p,q都是质数以及n%p==0,那么我们就找到了p和q,此时的n就是D_Prime。但是不幸的是,这样非常容易超时,因为循环非常耗费时间,所以我们要进行优化。这里采用的优化思路是分奇偶讨论n。
2025-12-02 13:11:30
399
原创 xtuoj 素数
由前面进制转换的经验,我们可以知道,我们想要得到所有的区间,应该,然后再将字符串转换为数字。,通过ascii码字符之间的关系知,。num首先初始化为0,然后从这里的digit依次从高位到低位取,最后得到的就是转换成数字以后的。要确定一个区间,肯定要先确定它的起点和终点,这里我们以 i 为起点,j 为终点,通过以下操作实现取得每个区间。下面的思路非常类似的思路。这段代码中用s[j] - '0'获取当前位的数字,配合配合内层循环中对num的更新逻辑,确实是一个非常巧妙的优化,核心在于s[j] - '0'
2025-11-11 17:53:05
646
原创 xtuoj Flawless Prime
如果一个素数,依次去掉最高位得到一个数,这个数无前导0,并仍然是素数,就称其为无暇素数素数不是无暇素数有两种情况。情况一:有0;情况二:去掉前面的数后,不是素数。所以关键点就是判断是否有0。为什么这里可以简化为直接判断有无0,而不是要考虑有无前导0呢,因为题目说了依次去掉最高位,所以等价。如何判断有无0,将数字的每一位单独存起来,如果发现有0,直接判断不是无暇素数。还有个关键就是如何判断依次去掉最高位后是否是素数。
2025-11-07 15:56:09
804
原创 xtuoj Binary
二进制的话就用位运算的知识比较方便,&就是按位与,&1就是判断最后一位的二进制是否为1,如果是len++,如果不是,则断掉了,len=0,同时记录当前最大的len,然后n>>=1,n右移一位,继续处理下一位,当n==0时,结束循环,也全部转换为二进制了,输出max即为答案,注意不要用int,否则它会显示超时,所以我换成long long就对了。
2025-11-04 20:17:19
237
原创 xtuoj 数码和
先看题目的输出要求,第一行是相同的数码和出现的最多的次数max_f,接下来的行数取决于有多少个数码和的出现次数等于max_f,如果有k个,那么后面输出k行,每行的第一个数是出现最多次的那个数码和值,接着是那些进制下的数码和值等于该值,将进制输出,然后进制之间按照升序,每行之间的顺序取决于数码和值的大小,按照数码和值的升序排列。观察题目,可知我们要求进制对应的数码和、数码和出现次数、数码和对应的进制。
2025-11-04 19:47:12
189
原创 xtuoj Min Base II
这里处理b的搜索机制可以参考,只不过这里数很大,所以不妨将第一个搜索区间扩大一点,这里就不赘述了。然后就是判断出现频率是否相同,首先通过除基取余法转为b进制,同时将b进制下每位数字的出现频率记录下来,然后判断出现过的数字中,是否每个数字的出现频率相同,若不同,则立刻判断该进制不符合,否则继续判断,直到判断完所有的后,还未判断为不符合,则该进制符合要求。
2025-11-02 16:39:05
336
原创 xtuoj 回文数
这里是将十进制转换为b进制,用到的是除基取余法,然后再判断该进制下转换的串够不构成回文串,这里我回顾了我之前写的回文串,,发现只要用双指针法即可,分别指向头和尾,如果不等,则立马判定为false,否则继续判断,头指针向后移动,尾指针向前移动,比较完后仍然没有判断为false,则为true。但是我发现别人写的代码要比我的代码快,做了一些优化。
2025-11-02 14:12:17
473
原创 xtuoj String Hash
首先将字符转换为数字,然后这样表示出来的是26进制,但是要在最前面加上一个1,再通过多项式法则转换为十进制,最后对该十进制%1000000007。字符转换为数字可以用数组存,也可以直接用一个变量存,因为只需要用到依次。
2025-11-02 13:01:30
296
原创 xtuoj 2021
这题的思路和前面写的的思路差不多,只是这里要注意一下要分析这个进制的上界。上界的分析:当这个数字串只有一位有效数字num时(有效数字就是把前导0去掉剩下的那些数字),必然不可能等于2021,因为最后一位是num*b^0,也就是num,num在0~9之间,所以不可能等于2021;
2025-11-02 11:49:42
579
原创 xtuoj 相同的数码
我采用的还是单调那题的思路,,其实差不多,这里只是变成了判断是否相等。就是你先设置一个pre,也就是在这串数码的最后设置一个数,这个数就让它等于最后一个数,因为题目要保证所有的数相等,然后dig设置为最后一个数,判断pre和dig是否相等,若相等,则继续比较,即设置pre=dig,n/=b,若不相等,即可立刻判断该进制下不成立。
2025-11-02 10:26:41
352
原创 xtuoj 单调
由于ai>ai-1恒成立,所以只要出现不成立的就可以提前终止,所以我想到了在线处理法,就是你先设置一个较小的值,能够满足它比所以可能出现的数都小,所以我们可以设置pre为-1,接着我们依次在线处理当前最低位的数(dig=n%base),如果dig<=pre,那么就不满足题目说的ai>ai-1,则可以立马判断该进制不符合要求false,如果判断完所有的数位后,仍然没有被判定为false,那么就返回true。然后我们从2进制开始判断就好了,因为b>=2,然后for(int b=2;
2025-10-31 15:31:43
368
原创 xtuoj A+B V
题目说总是忘记进位,所以他每次算出来的都是个位数,就是0-9,显然我们知道mod10以后得到的结果就可以是这样。所以,我们每次取出a和b的末位,这里用%10即可实现取出末位,然后得到的结果我们对其%10,这是因为他忘记进位,当前得到的数是最终结果的地位,所以我们要对其乘以权重,而最低位的权重是1。接着处理完末位以后,a/=10,b/=10,去掉末位,以便下次取出来的末位是我们要处理的数字,还有base*=10,对权重也要进行更新,这样我们下次处理的结果就会在正确的位置上,即左移一位。
2025-10-29 15:38:09
328
原创 xtuoj 平衡二进制2
关键是如何将十进制整数转换为平衡三进制。思考如何将十进制整数转换为普通的三进制呢,很显然用除基取余法即可,即除基取余,由低到高,商零为止。这是通用的将十进制整数转换为其他进制的方法,这里转换为三进制,那么基数取三即可。那么用代码怎么实现呢,首先商零为止,所以我们肯定用一个 while循环,且循环条件是 n!=0,也可以直接写成 while(n);除三取余,即 r=n%3,得到除三以后的余数,n=n/3 ,更新我们的商,然后商为0时终止循环;
2025-10-29 14:36:06
640
原创 xtuoj 水仙花数
计算数的位数。采用循环法即可,初始化位数 n 为0,去掉末位数并将当前数更新,即 t=t/10(/10相当于去掉末尾) ,然后位数加一, n++,但当前数为 0 时,位数计算完毕,终止循环。计算每个数位的 n 次方。采用快速幂,这里我为了避免 pow 函数精度问题并且提高效率,我采用了快速幂,直接套模板就好了,主要涉及的知识点是二进制与十进制的关系,以及位运算的知识。
2025-10-27 13:27:58
349
原创 xtuoj 奇怪的开关(含调和级数两种模板)
设 E[i] 表示当亮起的灯数是 i 盏到亮起的灯数是 k 盏的按键次数期望,E[i] = 1 + i/n * E[i] + (n-i)/n * E[i+1],1 表示当前按的这次,i/n表示按到亮起的灯的概率,(n-i)/n 表示按到灭的灯的概率,因为题目说选择灯的概率是等可能的,按到亮起的灯那么不会改变状态,所以有 i/n 的概率需要 E[i] 次按键才能实现最后亮起 k 盏灯;按到灭掉的灯,那么灭的那盏灯就会亮起,所以有 (n-i)/n 的概率需要 E[i+1] 次按键才能实现最后亮起 k 盏灯。
2025-10-23 20:31:00
473
原创 xtuoj 0和1
这是一个简单的数学题,唯一难的可能是计算组合数吧。我们设0的个数为k,那么1的个数就是k+m,01字符串长度是n,则k+m+k=n,计算得出k=(n-m)/2,0的个数为(n-m)/2,1的个数为(n+m)/2,由实际意义知,0和1的个数必然是整数,那么要求(n+m)%==2以及(n-m)%2==0,不满足任何一个条件,那么这样的排列方案数不存在。
2025-10-22 23:37:05
332
原创 xtuoj Repeat One
全部由数码1组成的数(如1, 11, 111, 1111, …)永远不能被2或5的倍数整除。也就是说,任何含有质因数2或5的正整数都无法整除这类数。原因在于: 这些数总是奇数,因此不能被2整除。这些数的个位总是1,因此不能被5整除。如果正整数M与10互质(即M不含质因数2或5),则总存在一个由全1组成的数能被M整除。因此,永远不能整除全1数的数就是所有2的倍数和5的倍数。
2025-10-22 23:04:44
387
原创 xtuoj Candy
通过模3运算我们可以把1~N中的数分成三部分,模三余0,模三余1,模三余2,即3n、3n+1、3n+2这三部分。题目要求取出来的三个数之和是3的倍数,那么有四种情况,从模三余0的数里面取三个、从模三余1的数里面取三个、从模三余2的数里面取三个以及从模三余0、1、2的数里面分别取一个。模三余0、1、2的个数分别设为c0、c1、c2。c0就是满足求1=<3n<=N中,n的个数,n最大取值为N/3,n=1,2,3,...,N/3,一共有N/3个,也就是说c0=N/3;
2025-10-22 21:04:21
806
原创 求逆元方法详解
费马小定理:如果模数p是一个质数,且整数a不是p的倍数(即a与pap−1≡1modpa×ap−2≡1modp所以,ap−2就是a在模p下的逆元。
2025-10-22 13:10:24
741
原创 组合数常见的四种计算方法
方法时间复杂度空间复杂度适用场景杨辉三角(DP)O(n*k)O(k) (优化后)需要多次计算不同的小规模组合数,适合预处理。乘法公式O(k)O(1)计算单个组合数的最快方法,n 和 k 不大,且结果在整数范围内。最常用。模逆元(p为质数)O(n) 预处理,O(1) 查询O(n)n, k 很大,需要对结果取模,且模数 p 是质数。编程竞赛标配。卢卡斯定理O(1)n, k 极大,但模数 p 相对较小。
2025-10-21 17:15:15
725
原创 xtuoj 两个数
从数组中取出两个元素,将其拆分成若干个1,然后加到剩余元素里面,使得剩余的 n-2 个元素值都相等,求这样的取法有多少种。一,由于取出来的元素都加到剩余元素里面了,所以元素的总和保持不变。二,剩余n-2个元素的值都相等,且总和为S,所以剩余每个元素应该最后是S/(n-2)。三,由于元素拆分为若干个1,所以如果剩余每个元素最后应该是整数,那么S%(n-2)==0,如果不满足,则不存在这样的取法。四,由于只能加不能减,所以我们必须要把 >T 的取出来,要保证剩下的元素都 <= T。
2025-10-21 16:19:20
297
原创 xtuoj 公共的数
x= ax+ b,当a ==1时,x- x= b,后一项比前一项多b,即x数列构成等差数列,且首项是0,那么很容易知道x数列将全部都是b的倍数。同理,当c == 1时,y数列也构成一个等差数列,y数列将全部都是d的倍数。当一次项系数不是1时,不构成等差数列,就是个一般数列。显然可以分为以下四类1.x、y都是等差数列2.x是等差,y不是等差3.x不是等差,y是等差4.x、y都不是等差注意这里首项是零,所以构成等差的话,数列一定是公差的倍数。对于都是等差的情况,那么公共的数就是b和d。
2025-10-20 22:39:00
332
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅