随笔分类 - 组合
摘要:打表发现一个排列满足要求,当且仅当这个排列以被拆成两个 LIS(其中一个可以为空)考虑状压 DP:$f[S][i][0/1]$ 表示加进去数集 $S$,第二个 LIS 的最大值为 $i$,是否顶上界.我们拆分 $LIS$ 的方式是贪心地将较大的值分给第一个,剩下的分给第二个. 这个时间复杂度大概是
阅读全文
摘要:不妨枚举哪些位置和睦,然后计算其他位置都不和睦的方案数. 令 $f[i]$ 表示 $i$ 对情侣都不和睦的方案数. 然后 $f[i]$ 的转移和错位排列比较相似,即让情侣 $(i,i')$ 与 $(x,y)$ 合并或者 $(x,x')$ 合并. 前者对应 $f[i-2] \times 2 \time
阅读全文
摘要:令 $f[S]$ 表示所选的排列可以生成出 $S$ 的最大独立集且点集 $S$ 全部在序列中的方案数. 那么我们选一个没有被覆盖的点 $j$,令 $sta[j]$ 表示 $j$ 及 $j$ 覆盖的点集. 那么有 $f[S|sta[j]] \leftarrow f[S] \times A(n-|S|-
阅读全文
摘要:令 $f(i,j)$ 表示 $j$ 的 $i$ 阶前缀和. 那么有 $f(i,j)=\sum_{j=1}^{i} f(i-1,j)$,这个可以直接多项式快速幂. 时间复杂度是 $O(n \log^2 n)$ 或 $O(n \log n)$ ,但是常数大而且第二种不好写. 考虑计算每一个位置 $j \
阅读全文
摘要:可以将问题抽象成选 1 就向右走,选 0 就向上走,且不能经过 y=x+1 的方案数. 考虑容斥:总-不合法. 总方案数就是 $\binom{n+m}{n}$,然后不合法的方案数对于 y=x+1 对称后发现就是 $(-1,1)$ 走到 $(n,m)$ 的方案数. code: #include <bi
阅读全文
摘要:自己独立想出来的,开心. 首先,对于 $x$ 不等于 $y$ 的情况,显然只限制前缀/后缀. 然后如果没有 x 与 y 相等的情况的话我们完全可以枚举总的 1 的个数,然后限制后缀的就可以转化成限制前缀的. 如果引入 x 与 y 相等的情况,也就是说要求前缀或后缀都填满也按照上述方式处理即可. 但是
阅读全文
摘要:这题怕不是 sb 题吧,随便分类讨论一下 $i$ 乘不乘 2 倍就没了. 然后细节要注意一下:题中要求的是大于等于. 求值域在 $[L,R]$ 中的元素个数时我用的权值线段树,可能会比二分要慢一点,但是不用判边界. code: #include <bits/stdc++.h> #define ll
阅读全文
摘要:自己想+切掉的,开心. 推一推就发现如果要权值最大,就尽量使用那个乘法. 然后就分两种情况讨论一下: 1. 乘法用到 k-1 次. 2. 乘法用不到 k-1 次. code: #include <bits/stdc++.h> #define ll long long #define N 3006 #
阅读全文
摘要:神仙题!!!! 其实还是有一点没有搞懂,但是大体上差不多懂了. code: #include <bits/stdc++.h> #define ll long long #define N 3200020 #define setIO(s) freopen(s".in","r",stdin) using
阅读全文
摘要:好神的一道计数题呀. code: #include <cstdio> #include <algorithm> #include <cstring> #define N 5000003 #define ll long long #define mod 998244353 #define setIO(
阅读全文
摘要:题意:令 $f(i)$ 表示对于 $\binom{n}{i}$ 种包含 $i$ 个点的最小连通块的总节点个数和. 面对个数和/价值和且点和点之间没有限制条件的问题时可以考虑单独处理每个点的贡献. 考虑点 $j$ 对 $f(i)$ 的贡献. 那么 $j$ 对 $f(i)$ 有贡献时分两种情况. 1.
阅读全文
摘要:12种组合计数问题合在一起. code: #include <cmath> #include <cstring> #include <algorithm> #include <cstdio> #include <string> #define ll long long #define ull uns
阅读全文
摘要:code: #include <cstdio> #include <algorithm> #define ll long long #define M 1000006 #define N 10000002 #define mod 1000000007 #define setIO(s) freopen
阅读全文
摘要:十分轻松的生成函数题. code: #include <cmath> #include <cstring> #include <algorithm> #include <cstdio> #include <string> #define ll long long #define ull unsign
阅读全文
摘要:挺好的一道数数题. code: #include <cmath> #include <cstring> #include <algorithm> #include <cstdio> #include <string> #define ll long long #define ull unsigned
阅读全文
摘要:套路:对于这种计算所有情况价值和的问题计算每一个点对答案的贡献. 我们发现,位置 $i$ 能对答案贡献 $val[i]$,当且仅当 $i$ 是前缀最大值,且 $i$ 不等于序列中最大元素. 我们不妨考虑哪些点大于等于 $val[i]$ 的位置,那么 $val[i]$ 能产生贡献的话显然要求 $i$
阅读全文
摘要:这个还是比较简单的. 将 $x$ 质因数分解,然后依次考虑每个质因子的贡献就行了,贡献是一个组合. code: #include <cstdio> #include <algorithm> #define N 2000006 #define ll long long #define mod 1000
阅读全文
摘要:code: #include <cstdio> #include <string> #include <cstring> #include <algorithm> #define N 66 #define ll long long #define mod 998244353 using namesp
阅读全文
摘要:思路很巧妙的一道题 ~ 这个应该不完全是正解,复杂度约为 $O(3\times 10^8)$,有时间再研究研究正解. 首先,最裸的暴力是按照权值从小到大枚举每一个数,然后枚举后面的数来更新方案数,是 $O(n^2)$ 的. 然后,我们可以用lucas定理来模拟那个组合数,会发现只需满足大数&小数=小
阅读全文
摘要:一定要注意要乘阶乘,细节很多. code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; const int N=2007;
阅读全文

浙公网安备 33010602011771号