摘要: #质数 1、试除法 For(int i = 1, i ≤ sqrt(x); i++) 2、埃氏筛(优化版) 求N以内的质数: 对于每个数x,只需从x²开始,将x²,(x+1)*x, (x+2)*x, ... ,[N/x]*x标记为合数即可; //#pragma comment(linker, "/S 阅读全文
posted @ 2021-11-04 21:05 Yra 阅读(76) 评论(0) 推荐(0)
摘要: 离散化 1、排序 2、对排序后的数据去重(可以使用unique),同时用1-m的数字和新数组储存; void discret() { sort(a + 1, a + 1 + n); int tot = 0; For(i, i, n) { if(i == 1 || a[i] != a[i-1]) un 阅读全文
posted @ 2021-11-04 20:22 Yra 阅读(93) 评论(0) 推荐(0)
摘要: 0x04 二分 两种二分写法: int l = 0, r = n + 1; while(l < r) { mid = l + (r - l) / 2; if(a[mid] >= x) r = mid; else l = mid + 1; } while(l < r) { mid = (l + r + 阅读全文
posted @ 2021-11-04 20:21 Yra 阅读(221) 评论(0) 推荐(0)
摘要: 前缀和 f[i] [j]为前缀和数组,a[i] [j]为原数组 f[i] [j] = f[i-1] [j] + f[i] [j-1] - f[i-1] [j-1] + a[i] [j] 算区间前缀和,画个图推公式 差分 原数组a[i], 差分数组f[i] = f[i] - f[i-1], f[1] 阅读全文
posted @ 2021-11-04 20:20 Yra 阅读(75) 评论(0) 推荐(0)
摘要: 位运算 1、a*b%p 方法一:将b用二进制表示然后递推累乘 for(; b; b >>= 1) { ans = (ans + (b & 1) * a % p) %p; a = a * 2 % p; } 方法二:将ab mod p 转换成 ab - ⌊ab/p⌋ * p 令c = ⌊ab/p⌋; 用 阅读全文
posted @ 2021-11-04 20:18 Yra 阅读(120) 评论(0) 推荐(0)
摘要: 树状数组 树状数组可以将一整个区间划分为几个区间,T[i]包含的A[]原数组数量为 lowbit(i), 单点更新,区间查询 //单点更新操作 void update(int i, int x) { for(; i <= n; i += lowbit(i)) { t[i] += x; } } //区 阅读全文
posted @ 2021-11-04 20:16 Yra 阅读(43) 评论(0) 推荐(0)
摘要: ST表 处理RMQ问题,即区间最值 用O(nlogn)预处理,O(1)查询最值 思想:倍增 maxx[i] [j] 表示从i位置开始的$2^j$个数字的最大值 板子 //#pragma comment(linker, "/STACK:10240000000000,10240000000000") / 阅读全文
posted @ 2021-11-04 20:15 Yra 阅读(140) 评论(0) 推荐(0)