随笔分类 - 算法竞赛 / 算法竞赛 - 数学
摘要:最大公因数(GCD) 两个数的最大公因数很好做,使用内置的库函数即可,注意x和y的类型要相同。 ll gcd = __gcd (x, y); 如果要求多个数的最大公因数,那么初始化为0(因为根据定义,0和任何数x的gcd都是x,所以0是gcd操作的幺元),然后分别进行gcd即可。 ll gcd =
阅读全文
摘要:父级页面:【数学】组合数学 卡特兰数 记号为 第n个卡特兰数,下面的n就是指这个。 卡特兰数最常见的场景是合法的括号序,还有栈进出的方案。他们的特点就是“右括号”、“出栈”的次数不能超过剩余
阅读全文
摘要:父级页面:【数学】组合数学 排列 组合 可重排列 可重组合 隔板法 盒子可以为空 隔板法:x个相同的小球,有y个不同的盒子,每个盒子可以为空,求有多少种方案数?把y个不同的盒子视作y-1个不同的隔板,然后把小球视作不同的,全排列有 种,然后除以隔板的全排列
阅读全文
摘要:/* MOD must be a prime. if not, don't use inv() */ const int MOD = 1e9 + 7; struct ModularIntegers { #define mint ModularIntegers int num; mint() { nu
阅读全文
摘要:简易的多项式。用来粗暴模拟。 struct Poly { static const int MAXN = 1e3 + 10; int deg, f[MAXN]; Poly() { deg = 0, memset(f, 0, sizeof(f)); } int& operator[](int inde
阅读全文
摘要:TODO:可能需要一个更快速复制、合并的版本,下面这个常数非常大。 注意这里的z表示是否可以选取若干个非空的线性基组合出0。对于某些问题来说如果插入的数字中带有0的话,需要特殊处理。 下面版本的线性基的插入过程实际上是两步:检查新出现的元素和线性基中所有向量xor之后是不是为0,虽然检查到一半就已经
阅读全文
摘要:不打开O2的话效率不够高,但是这种程度上的优化确实应该留给编译器去做了,学个计算机假如连编译器能做的优化都要手动去做并且牺牲程序的简洁性,那还是早点改行去工地搬砖吧。 const int MAXLOGN = 20; const int MAXN = 1 << MAXLOGN; const int M
阅读全文
摘要:把正整数n分成若干个正整数之和的方法数。 http://www.51nod.com/Challenge/Problem.html#problemId=1259 动态规划 答案是g[n] const int MAXF = 1e3 + 10; const int MAXG = 2e5 + 10; int
阅读全文
摘要:斯特林子集数/第二类斯特林数 从把n个不同的小球放到k个相同的盒子里,且每个盒子至少要有一个小球的选法。 快速计算一行斯特林数: 使用这个式子 \({n \brace m} = \frac{1}{m!} \sum\limits_{i=0}^m (-1)^i \binom {m}{i} (m-i)^n
阅读全文
摘要:多项式加减乘法 \[ h1(x)=\sum\limits_{i=0}^{n1-1}h_{1i}\cdot x^i; \forall i \ge n1, h1_{i} = 0.\\ h2(x)=\sum\limits_{i=0}^{n2-1}h_{2i}\cdot x^i; \forall i \ge
阅读全文
摘要:质因数分解法求Mobius函数 const int MAXN = 1e6 + 10; int p[MAXN], ptop; int pm[MAXN], pk[MAXN], mu[MAXN]; void sieve(int n) { memset(pm, 0, sizeof(pm[0]) * (n +
阅读全文
摘要:struct InverseMatrix { static const int MOD = 1e9 + 7; static const int MAXN = 400 + 10; int n; int A[MAXN][MAXN]; int B[MAXN][MAXN]; void Init(int n)
阅读全文
摘要:struct Matrix { static const int MOD = 1e9 + 7; static const int MAXK = 400 + 10; int k, A[MAXK][MAXK]; void Init(int k) { this->k = k; memset(A, 0, s
阅读全文
摘要:验证链接:https://www.luogu.com.cn/problem/P5091 namespace exET { int calcA(char *a, int mod) { ll res = 0; for(int i = 1, n = strlen(a + 1); i <= n; ++i)
阅读全文
摘要:SG函数 const int MAXN = 600000; int n; int sg[MAXN]; int SG(int x) { // 默认值为-1 if(sg[x] != -1) return sg[x]; bool used[32] = {}; // 这里写递归到后继状态 for(int i
阅读全文