CF combinatorics 自制题单(一)

CF combinatorics 1700 ~ 1900

40道摘自 div1 和 div2 的比较有趣的题目

1. Problem - 1557C - Codeforces

构造一个长度为 n ( n ≤ 1 0 5 ) n (n \le 10^5) n(n105) 的数列 a a a a i ≤ 2 k ( k ≤ 1 0 5 ) a_i \le 2^k(k \le 10^5) ai2k(k105),使得 a 1   &   a 2   &   a 3   &   …   &   a n ≥ a 1 ⊕ a 2 ⊕ a 3 ⊕ … ⊕ a n a_1 \,\&\, a_2 \,\&\, a_3 \,\&\, \ldots \,\&\, a_n \ge a_1 \oplus a_2 \oplus a_3 \oplus \ldots \oplus a_n a1&a2&a3&&ana1a2a3an.

n n n 是奇数的时候,从高到低看,只要当前位的数字有偶数个1,就一定满足条件,那么对于这一位,自由度为 n − 1 n-1 n1,即前 n − 1 n - 1 n1 个数字随意填,可以直接确定第 n n n 个数字填什么;当然还有一个就是全部填1也是满足的。这 k k k 位是相互独立的。因此答案是 ( 2 n − 1 + 1 ) k (2^{n-1}+1)^k (2n1+1)k.

n n n 为偶数的时候,如果每一位填偶数个1并且不填满1,就是 ( 2 n − 1 ) k (2^{n-1})^k (2n1)k 中选择. 如果当前为填满了1,那么后面可以随便填。加入第 i i i 位填满了1,那么高于 i i i 位的要填偶数个1且不能填满,低于 i i i 位的可以随便填,总共的方案就是 ∑ i = 1 k ( 2 n − 1 − 1 ) i − 1 ( 2 n ) k − i \sum\limits_{i=1}^k(2^{n-1}-1)^{i-1}(2^n)^{k-i} i=1k(2n11)i1(2n)ki.

2. Problem - 1552C - Codeforces

给一个圆,圆上有 2 n ( n ≤ 100 ) 2n(n \le 100) 2n(n100) 个不重合的点,保证任意三条弦不会交于圆内的同一点. 现在给 k k k 条弦(弦的端点各不相同),现在用剩下的 2 ( n − k ) 2(n-k) 2(nk) 个点构造 n − k n-k nk 条弦,使得所有弦的交点之和最多.

首先看两条弦相交的充要条件。假设两条弦为 x i , y i ( x i < y i ) x_i, y_i(x_i < y_i) xi,yi(xi<yi) x j , y j ( x j < y j ) x_j,y_j(x_j < y_j) xj,yj(xj<yj). 那么四个点只有形成 x i < x j < y i < y j x_i < x_j < y_i < y_j xi<xj<yi<yj 才会相交.

贪心策略就是,选择一种方法让剩下的 n − k n-k nk 条弦全部相交。其实就是 1 1 1 n − k + 1 n-k+1 nk+1 连接, 2 2 2 n − k + 2 n-k+2 nk+2 连接这样子。

这样子,仍然可以保证新的弦与原本的弦连线不会减少,可分为两种情况讨论(红色的为新的弦,黑色的为原本的弦):
在这里插入图片描述在这里插入图片描述
任意两条弦交换之后,与原本的任意一条弦的交点都不会减少,所以总数就不会减少。

3. (再写) Problem - 1528B - Codeforces

2 n 2n 2n 个点两两相连形成 n n n 对,对于任意两个点对 A A A B B B ,要求至少满足其中一条:

  1. A A A B B B 的某一个完全包含于另一个中 2.
  2. A A A B B B 的长度相等.

问你一共有多少种方案.

题目有一个很特殊的性质,就是如果确定了端点在 1 1 1 号点的线段长度,就会简单一些,因为没有更长的线段可以覆盖这条线段.

很妙的一道题,一个月后再写一次.

4. (再写) Problem - 1508B - Codeforces

如果一个排列满足 a i + 1 > a i − 1 a_{i+1} > a_i - 1 ai+1>ai1,那么成这个排列为 “几乎排好序的排列”。现在给定 n ( n ≤ 1 0 5 ) n(n \le 10^5) n(n105),问字典序为第 k ( k ≤ 1 0 18 ) k(k \le 10^{18}) k(k1018) 的 “几乎排好序的排列” 是什么.

没有想出来解法

首先合法排列即为把序列划分成几个不交的连续子序列,把每个子序列 reverse 一下。这两者是一一对应的.

然后,长度为 n n n 合法排列数量是 2 n − 1 2^{n-1} 2n1. 可以这么想,对于新加的数字 n n n。首先 n n n n − 1 n-1 n1 分到不同的段中,划分数量是 f ( n − 1 ) f(n-1) f(n1) 种;然后 n n n n − 1 n - 1 n1 捆绑在一起,即在同一段中,又是 f ( n − 1 ) f(n-1) f(n1) 种. 因此 f ( n ) = 2 f ( n − 1 ) f(n) = 2f(n-1) f(n)=2f(n1).

最后,可以观察一下 k − 1 k-1 k1 的二进制形式与划分的关系,可以找到一个很巧妙的双射.

5. Problem - 1444B - Codeforces

给长度为 2 n ( n ≤ 150000 ) 2n(n \le 150000) 2n(n150000) 的序列,把它划分成两个长度为 n n n 的子序列,即为 p p p q q q. 把 p p p 按不降顺序排序, q q q 按照不升顺序排序. 定义 f ( p , q ) = ∑ i = 1 n ∣ x i − y i ∣ f(p, q) = \sum\limits_{i=1}^{n}|x_i - y_i| f(p,q)=i=1nxiyi. 求所有划分的 p , q p, q p,q f ( p , q ) f(p, q) f(p,q) 之和.

打标找规律就知道答案就是 C 2 n n ( ( ∑ i = 1 n a i ) − ( ∑ i = n + 1 2 n a i ) ) C_{2n}^{n}\Big((\sum\limits_{i = 1} ^ {n}a_i)-(\sum\limits_{i=n+1}^{2n}a_i)\Big) C2nn((i=1nai)(i=n+12nai))

证明两个东西:

  1. 小于等于 n n n 可以放进第一个集合,大于 n n n 可以放进第二个集合
  2. c n t ( i , n + 1 ) + c n t ( i , n + 2 ) + c n t ( i , n + 3 ) + . . . c n t ( i , n + n ) = c n t ( 1 , j ) + c n t ( 2 , j ) + c n t ( 3 , j ) + . . . c n t ( n , j ) = C 2 n n cnt(i, n + 1) + cnt(i, n + 2) + cnt(i, n + 3) + ... cnt(i, n + n) = cnt(1, j) + cnt(2, j) + cnt(3, j) + ... cnt(n, j) =C_{2n}^{n} cnt(i,n+1)+cnt(i,n+2)+cnt(i,n+3)+...cnt(i,n+n)=cnt(1,j)+cnt(2,j)+cnt(3,j)+...cnt(n,j)=C2nn

6. Problem - 1442B - Codeforces

一个数组 a a a 长度为 n n n,一个数组 b b b 长度为 m m m a a a 数组中的元素各不相同, b b b 数组中的元素各不相同。在 a a a 数组中要将 a i a_{i} ai 加入到 b i b_{i} bi 中,可以将 a i − 1 a_{i-1} ai1 a i + 1 a_{i+1} ai+1 划去,然后 a i a_i ai 加入到 b b b 数组的右侧。问得到 b b b 数组的总方案数,答案对 998244353 998244353 998244353 取模.

其实模拟一边就可以了,看当前数字的左右两侧有哪些可以删掉的数字. 比如 a , b , c a,b,c a,b,c,如果想得到 c c c,可以删 b b b 的话,删掉之后, a a a 的右边的数字变成了 c c c,仍是一个可以删掉的数字。因此前面的操作并不会使后面的数字的操作选择变少. 因此答案就是每个数字两边可以删掉的数字之积.

7. Problem - 1422C - Codeforces

给一个长为 n ( n ≤ 1 0 5 ) n(n \le 10^5) n(n105) 的数字,可以从中扣掉一个非空子串,把剩下的两部分拼起来获得一个新的数字;求获得的所有数字之和.

从后往前枚举,枚举当前数字(从第 i i i 位到第 n n n 位)作为后半部分,有 n − i n-i ni 中情况;从前往后枚举,当前数字(从第 1 1 1 位到第 i i i 位)作为前半部分,后面数字之和是 ∑ i = 0 n − i − 1 1 0 i \sum\limits_{i=0}^{n-i-1}10^i i=0ni110i.

8. Problem - 1420D - Codeforces

n n n 个区间,选出 k k k 个区间使得它们的交不为空,问有多少种选择方案.

套路题,区间的交可以从左括号右括号来考虑。当左括号的深度 ≥ k \ge k k 的时候就合法.

9. Problem - 1400D - Codeforces

给一个长度为 n ( n ≤ 3 × 1 0 3 ) n(n \le 3 \times 10^3) n(n3×103) 的序列 a a a,问有多少个四元组 ( i , j , k , l ) (i, j, k, l) (i,j,k,l),满足 1 ≤ i < j < k < l ≤ n 1 \le i < j < k < l \le n 1i<j<k<ln,有 a i = a k a_i = a_k ai=ak a j = a l a_j = a_l aj=al.

从大到小枚举 j j j,不断更新 > j > j >j 的二元组 ( a k , a l ) (a_k, a_l) (ak,al) 的 map,看看前面有多少个 i i i 满足条件,直接统计即可.

10. Problem - 1329B - Codeforces

要求构造一个非空序列,每一个元素都在 [ 1 , d ] [1,d] [1,d] 之间,每个元素都是递增的,并且他们的异或前缀和也是递增的. 问这样序列的数量。

可以观察到由于 s u m i < a i + 1 sum_i < a_{i+1} sumi<ai+1. 若两者最高位的 1 1 1 所在的位数是一样的,那么必然会使得前缀和的那一位变为 0 0 0,因此最高位的 1 1 1 所在位置应该是递增的.

那么每一个位置,能选择的数字都有数量。那么方案数,从后往前 d p dp dp 一下就出来了.

11. Problem - 1312D - Codeforces

构造一个长度为 n n n 的序列,序列的每个数字在 [ 1 , m ] [1, m] [1,m] 之间,要求序列中有且仅有一对相同的值;并且存在一个 i i i,使得 j < i j < i j<i 时有 a j < a j + 1 a_j < a_{j + 1} aj<aj+1 j ≥ i j \ge i ji 时有 a j > a j + 1 a_j > a_{j + 1} aj>aj+1.

首先最大的数字可以确定,可选的范围是 i ∈ [ n − 1 , m ] i \in [n-1,m] i[n1,m],然后其余 n − 1 n-1 n1 个数字只有 n − 2 n-2 n2 种取值,所以是 C i − 1 n − 2 C_{i-1}^{n-2} Ci1n2;最后,最大数字可以放的位置是 2 ∼ n − 1 2 \sim n-1 2n1 位,由于强制要求两个相同的数字放在两边,因此能够自由选择在两边的数字有 n − 3 n-3 n3 个,因此最大数的位置不同,方案数有 C n − 3 0 + C n − 3 1 + . . . + C n − 3 n − 3 = 2 n − 3 C_{n-3}^0+C_{n-3}^1+...+C_{n-3}^{n-3} = 2^{n-3} Cn30+Cn31+...+Cn3n3=2n3.

12. Problem - 1301C - Codeforces

给一个 01 序列,令 f ( n , m ) f(n, m) f(n,m) 为含有 m m m 1 1 1 的长度为 n n n 的序列,有多少个子区间含有至少一个 1 1 1.

让连续的0的子区间连续长度尽可能得小,即让 0 0 0 越分散越好。具体来说, n − m n-m nm 0 0 0 尽可能均匀地分到 m + 1 m+1 m+1 个空格中.

13. Problem - 1279D - Codeforces

i i i 个小朋友想要 k i k_i ki 个不同的礼物中的一个作为他的礼物。
机器人执行如下的操作:

  1. 等概率地从 n n n 个孩子中选择孩子 x x x
  2. 从第 x x x 个小孩想要的 k x k_x kx 个礼物中等概率地选出 y y y 礼物
  3. 等概率地选择一个小孩 z z z 去接受这个礼物

( x , y , x ) (x, y, x) (x,y,x) 被叫做机器人的一种选择
如果小孩 z z z 列出的礼物中存在 y y y 礼物,那么这个选择就是有效的。计算这个选择有效的概率

首先计算出每种礼物 a a a 每选择的概率就是 1 n ∑ i = 1 n [ a ∈ S i ] 1 k i \dfrac{1}{n} \sum\limits_{i=1}^{n} [a \in S_i]\dfrac{1}{k_i} n1i=1n[aSi]ki1. 假设礼物 a a a c n t cnt cnt 个小孩子去选,那么 a a a 最终在 z z z 名单中的概率就是 P a ∗ c n t n P_a * \dfrac{cnt}{n} Pancnt.

14. Problem - 1276B - Codeforces

给一个 n n n 个点 m m m 条边的图,给定两个点 a , b a, b a,b,问有多少对点 x , y ( x , y ≠ a , b ) x, y(x ,y \ne a,b) x,y(x,y=a,b),使得从 x x x y y y 必须经过 a a a b b b.

相当于把 a a a 点扣掉,看哪些点和 b b b 不在同一连通分量里面,对于 b b b 也这么处理. 然后把两类点乘起来就行了.

15. Problem - 1239A - Codeforces

给一个 n ∗ m n*m nm 的方格染色,染两种颜色,要求相邻格子最多有一个颜色和自己相同,问方案数.

我们发现当第一行确定的时候(如果不是 01010101.. 01010101.. 01010101.. 这种的),下面所有行的格子都可以确定。同样,第一列确定的时候也是如此。最后容斥掉 01010101 01010101 01010101 这种的就可以了,答案就是 f ( n ) + f ( m ) − 2 f(n) + f(m) - 2 f(n)+f(m)2.

f f f 的方法,我用的是 f ( n , 4 ) f(n, 4) f(n,4),第二维 00 00 00 表示最后两个白色, 01 01 01 表示最后一白一黑,一次类推,可以推出来一个递推式。还有更简单的,其实就是 f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n) = f(n - 1) + f(n - 2) f(n)=f(n1)+f(n2).

16. Problem - 1238D - Codeforces

定义一个字符串为 “好字符串” 当且仅当每一个字符都属于一个回文子串,比如 “AABB”. 现在给一个只由 “A” 和 “B” 组成的字符串,问有多少个子串是 “好字符串”

我们找以 i i i 结尾的字符串有多少个子串是满足条件的. 只需讨论四种情况,即最后两个字符是 00 , 01 , 10 , 11 00,01,10,11 00,01,10,11. 以 00 00 00 为例,手画一下就知道,记上一个出现 1 1 1 的位置是 id,那么以 i i i 结尾的长度大于 1 1 1 的字符串,只由 s [ i d : i ] s[id:i] s[id:i] 不是好字符串,其余都是好字符串. 然后 d p dp dp 一下就可以了

17. Problem - 1207D - Codeforces

给定一个 pair 序列,将序列重排,问有多少种重拍的结果,满足下面条件之一:

  1. 第一个元素为不降顺序.
  2. 第二个元素为不降顺序.

其实就是满足,第一个元素为不降顺序的排列数 c n t 1 cnt_1 cnt1,第二个元素为不降顺序的排列数 c n t 2 cnt_2 cnt2,与两者都为不降顺序的排列数 c n t 3 cnt_3 cnt3. 答案就是 n ! − c n t 1 − c n t 2 + c n t 3 n! - cnt_1 - cnt_2 + cnt_3 n!cnt1cnt2+cnt3. 前两个都好求,第三个按照 pair 类型排序后统计即可.

18. Problem - 1202D - Codeforces

构造一个只含 { 1 , 3 , 7 } \{1, 3, 7\} {1,3,7} 的序列,使得其恰好含有 n ( n ≤ 1 0 9 ) n(n \le 10^9) n(n109) 子序列 { 1 , 3 , 3 , 7 } \{1, 3, 3, 7\} {1,3,3,7}. 构造序列长度不可以超过 1 0 5 10^5 105.

可以简化问题,找到最大的 x x x 满足 x ( x − 1 ) 2 ≤ n \dfrac{x(x-1)}{2} \le n 2x(x1)n ,令 m = n − x ( x − 1 ) 2 m = n - \dfrac{x(x-1)}{2} m=n2x(x1). 构造的子序列是 ‘1’ + ‘33’ + m m m × \times × ‘7’ + ( x − 2 ) (x-2) (x2) × \times × ‘3’ + ‘2’

19. Problem - 1181C - Codeforces

给一个 n ∗ m n * m nm 的网格图,每一个格子有一种颜色(由 a ∼ z a\sim z az 表示颜色),如果图中有一个子区域是如下图所示,就称作flag,flag的条件:
1,由三层组成,中间层的颜色和上下两层的颜色不同
2,这三层,每层所占行数一样
3,flag的宽度至少是1
问你该图中最多可以组合出几个flag
在这里插入图片描述

我们统计每个 ( i , j ) (i,j) (i,j) 作为 flag 的右下角,有多少种取值. 往上走只有一种旗帜的情况;这个可以处理每一个位置往上延伸有多少个相同的颜色得到。然后再处理每个位置往左能延伸多少个相同颜色。

20. Problem - 1172B - Codeforces

在圆上有n个节点(珂以构成凸多边形),让你给节点编号,使得将题目给你的边(一棵树)没有交叉

根据样例猜答案 n ∑ i = 1 n ( d e g [ i ] ) ! n\sum\limits_{i=1}^{n}(deg[i])! ni=1n(deg[i])!

可以这么思考,两条弦只要有同一端点,不管怎么摆都不会相交. 端点都不同时才可能出现相交的情况. 因此可以先选定一树根,那么子树一定是连续拜访的. 然后每个子树之间可以随意交换位置,就有了上面那个公式.

21. Problem - 1091D - Codeforces

把长度为 n n n 的所有排列按照次序写下来,比如 n = 3 n = 3 n=3 的时候是 p = [ 1 , 2 , 3 , 1 , 3 , 2 , 2 , 1 , 3 , 2 , 3 , 1 , 3 , 1 , 2 , 3 , 2 , 1 ] p = [1, 2, 3, 1, 3, 2, 2, 1, 3, 2, 3, 1, 3, 1, 2, 3, 2, 1] p=[1,2,3,1,3,2,2,1,3,2,3,1,3,1,2,3,2,1]. 问有多少个长度为 n n n 的连续子区间, 1 ∼ n 1 \sim n 1n 各出现了 1 1 1 次.

打标找规律发现,每个排列写下来,不合法的开头就是从最后一位开始的最长下降连续子序列,比如 [ 1 , 3 , 5 , 4 , 2 ] [1, 3, 5, 4, 2] [1,3,5,4,2],不合法的开头就是 5 , 4 , 2 5, 4, 2 5,4,2,就是所有最长连续下降后缀乘后缀长度. 这个并不好算。 其实就是等价去找就是查询固定长度为 k ( k ∈ [ 1 , n − 1 ] ) k(k \in [1, n - 1]) k(k[1,n1]) 的连续下降后缀有多少个,这个好算. 即不合法的连续子区间开头有 ∑ i = 1 n − 1 C n k ∗ ( n − k ) ! = ∑ i = 1 n − 1 n ! k ! \sum\limits_{i=1}^{n-1}C_{n}^{k} * (n-k)! = \sum\limits_{i=1}^{n-1}\dfrac{n!}{k!} i=1n1Cnk(nk)!=i=1n1k!n!.

22. Problem - 1043D - Codeforces

m ( m ≤ 10 ) m(m \le 10) m(m10) 个排列,排列 n ( n ≤ 1 0 5 ) n(n \le 10^5) n(n105),问有多少个子串都出现在这 m m m 个排列中.

枚举从每个数字出发的子串,每次看能否前进一步,那么每个位置只会被枚举一次。

23. Problem - 1036C - Codeforces

[ L , R ] [L,R] [L,R] 之间有多少个数字含有的非零数位不超过 3 3 3 个的 正整数, T ≤ 1 0 4 , 1 ≤ L , R ≤ 1 0 18 T \le 10^4, 1 \le L, R \le 10^{18} T104,1L,R1018.

入门级数位 d p dp dp,注意这个无需记录前导零,而且就算 0 0 0 被计入也没关系,因为 0 0 0 会同时被 L L L R R R 计入,最后结果会自动减掉.

24. Problem - 1000D - Codeforces

一个数组 [ a 1 , a 2 , . . . , a k ] [a_1,a_2,...,a_k] [a1,a2,...,ak] 称为好数组,当且仅当 a 1 = k − 1 a_1 = k - 1 a1=k1 a 1 > 0 a_1 > 0 a1>0. 一个好序列的定义是可以划分成若干连续子段,每个部分都是好数组。现在给一个长度为 n ( n ≤ 1 0 3 ) n(n \le 10^3) n(n103) 的子序列,问有多少个子序列是好序列。

我们可以枚举每个好序列的结尾,然后从上一个好序列的结尾转移过来。先预处理出所有从 i i i 开头到 j j j 结尾的好数组的数量,即 g ( i , j ) = C j − i − 1 a i − 1 g(i,j) = C_{j - i - 1}^{a_i - 1} g(i,j)=Cji1ai1. 然后,结尾为 i i i 的序列从结尾为 j j j 的序列转移过来,就是 f j ∗ ∑ k = j + 1 i − 1 g ( i , j ) f_j * \sum\limits_{k=j+1}^{i-1}g(i,j) fjk=j+1i1g(i,j).

25. Problem - 991E - Codeforces

给你一个数字序列A(长度不超过18位),问有多少个序列B满足

  1. A中所有数字都一定要在B中出现过;
  2. B中所有数字也一定要在A中出现过;
  3. 序列B不能以0开头

多重集组合数,直接深搜枚举多重集,然后组合一下就行了.

26. Problem - 986B - Codeforces

给一个 1 ∼ n 1 \sim n 1n 的一个排列,有两种随机排序方式。第一种是挑选两个不同的元素交换 3 n 3n 3n 次,第二种是挑选两个不同的元素交换 7 n + 1 7n + 1 7n+1 次. 现在给交换过后的序列,问是那种随机排序得到的.

首先我们可以发现 7 n + 1 − 3 n = 4 n + 1 7n + 1 - 3n = 4n + 1 7n+13n=4n+1. 说明两者的奇偶性一定不同。然后看一下从 1 ∼ n 1\sim n 1n 的排列变为输入的排列需要多少次. 其实模拟一边就可以了,如果 a [ i ] ≠ i a[i] \ne i a[i]=i 的话,就把 i i i 丢掉 a i a_i ai 这个位置,然后把 a i a_i ai 丢掉 i i i 原来所在的位置。然后这样子就算出来一个可行的交换次数. 然后看一下 3 n − c n t 3n - cnt 3ncnt 的奇偶性就可以了.

标解给的是计算一下逆序对的个数

27. Problem - 914C - Codeforces

对一个数字 x x x 进行一步操作,让 x x x 变成 x x x 的二进制表示下 1 1 1 的个数. 比如 13 ( 110 1 ( 2 ) ) 13(1101_{(2)}) 13(1101(2)) 经过一次操作变成 3 3 3. 问 1 ∼ n ( n ≤ 2 1000 ) 1 \sim n (n \le 2^{1000}) 1n(n21000) 范围内有多少个数字可以通过恰好 k ( k ≤ 1000 ) k(k \le 1000) k(k1000) 步操作变成 1 1 1.

观察到任何一个数字经过 1 1 1 步操作都可以变成不超过 1000 1000 1000 的数字. 因此可以先处理出来 1 ∼ 1000 1\sim 1000 11000 之内每个数字需要多少步变成 1 1 1. 然后数位 d p dp dp 一下就可以了.

小心要把那个 n n n 的字符串 reverse! 因为是从高位往低位进行数位 d p dp dp.
1 1 1 需要单独处理, k = 0 k = 0 k=0 时 1 是满足条件的,但是 k = 1 k = 1 k=1 1 1 1 是不满足条件的.

28. Problem - 894B - Codeforces

给一个 n ∗ m ( 1 ≤ n , m ≤ 1 0 18 ) n * m(1 \le n, m \le 10^{18}) nm(1n,m1018) 的棋盘,每个格子可以放一个棋子。问有多少种方案,使得每行每列棋子数量都是奇数 ( k = − 1 k = -1 k=1)?都是偶数 k = 1 k = 1 k=1

k = − 1 k = -1 k=1,且 n + m n + m n+m 是奇数,输出0. 原因:不妨设 n n n 是奇数 m m m 是偶数。假设存在一种合法方案,那么有 n n n 行,每行棋子数量是奇数,那么棋子个数是奇数. 有 m m m 列,每列奇数个棋子,所以总共偶数个石子. 这就导出了矛盾.

否则,输出 2 ( n − 1 ) ( m − 1 ) 2^{(n-1)(m-1)} 2(n1)(m1). 原因是只有 ( n − 1 ) ( m − 1 ) (n-1)(m-1) (n1)(m1) 的自由度,答案就是 2 ( n − 1 ) ( m − 1 )   m o d   p − 1 2^{(n-1)(m-1) \bmod p-1} 2(n1)(m1)modp1. 指数取模小心要模欧拉函数.

29. Problem - 869C - Codeforces

不会写,一个月后再写
有三种颜色的点,分别有 a , b , c a,b,c a,b,c 个,现在连双向边,要求相同颜色的点之间要么互相无法到达,要么最小距离不少于 3 3 3. 求方案数。

最小距离不小于 3 3 3,说明相同颜色之间没有边,并且一个点不可以连接两个相同颜色的点。

那么,这张图其实可以划分成独立的三个部分,分别是颜色 1 1 1 和颜色 2 2 2,颜色 2 2 2 和颜色 3 3 3,颜色 1 1 1 和颜色 3 3 3. 每部分单独计数,最后乘起来。每部分的方案数是 ∑ i = 0 min ⁡ ( A , B ) C A i ∗ C B i ∗ i ! \sum\limits_{i=0}^{\min(A,B)}C_{A}^{i}*C_{B}^{i}*i! i=0min(A,B)CAiCBii!

30. Problem - 711D - Codeforces

n ( n ≤ 2 × 1 0 5 ) n(n \le 2 \times 10^5) n(n2×105) 个点 n n n 条边的有向图,保证无自环无重边. 问有多少种边组成的集合,使得对集合中的所有边反向,图中没有环。

首先我们发现,这个图是一个基环树森林,不过也可能没有环。那么对于环上的每条边,只有两种状态是消不掉环的。一个是把所有边反向,另一个是所有边方向不变。假设环的大小是 c n t cnt cnt. 那么这种方案是 2 c n t 2^{cnt} 2cnt 种.

那么怎样计算环的大小呢?我是记录了一个 d e p dep dep 数组。每次遍历的起点的 d e p dep dep 都是 0.

从一个点出发遍历图,有三种可能性:

  1. 从环外一个点走到环上,然后走完整个环
  2. 从环外一点走,走到环上停止
  3. 从环外一点走,没有走到环上就停止

分别计数即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值