CodeForces Round #369 (div.2) Descreption
A
有N排座位,每排有4个,这4个被分成了两组。给出每个座位是否是空的,问是否有相邻的座位。
B
给你一个N * N的幻方,其中缺了一个格子,要求你填上。
C
有N个点M种颜色,有些点没有颜色。给出了每个点分别染色成每种颜色的代价,要求染色后颜色的段数等于K。求最小代价。
D
有N个点,每个点有一条出边,你可以任意转换边的方向。问有多少种方案,使得整个图没有环。
E
一年有2 ^ N天,有K个人。问有两个人生日在同一天的概率。请输出最简分数,同时最简分数的分子分母还要取模。
CodeForces Round #369 (div.2) Solutions
A
直接检查即可,注意字符串的读入。
B
任取一个已经填满的行,算出和,求出空白,再验证:
- 行,列,主对角线的和是否一样。
- N是否为1。
- 答案是否为负数。
C
一个显然的DP。对于每个点只需要纪录两个状态:该点的颜色、从1到该点的颜色段数。转移时只要枚举下一个点的颜色(如果未确定),再判断颜色段数是否增加(即是否和当前颜色一样)即可。复杂度O(N ^ 4).
优化:
D
- 首先可以看出这个图是一个环套树的森林。(了解一下环套树的概念)
- 考虑一个环套树:对于一个无向环,只有两种反转会使得他变成一个有向环。对于不在环上的边,是否取反显然无关。那么这个环套树的方案即(2 ^ M - 2) * 2 ^ (N - M),其中N是环套树的点数,M是环的大小。
- 不同的连通块的答案显然可以相乘。
E
这个题的答案是一个显然且经典的问题。设一年有N天,一共有K个人,那么所有人的生日都不在同一天的概率(即答案的补)为(N - 1) * (N - 2) * … * (N - K + 1) / N ^ K. 详细证明见《算法导论5.4.1》。
接下来的任务是约分。因为天数是2 ^ N,所以只用计算分子中有多少个2即可。观察下分子,发现分子中2的个数和-1 to -K + 1中的个数一样,即和1 to K - 1中的个数一样。统计1 to K - 1中2的个数是个十分简单的问题,分别计算2的幂的出现次数并求和即可。
最后要对分子和分母取模。分母取模是一个快速幂的事情。观察到模数特别小,而分子是一段连续数的连乘,且约去的数只有2(因为2和Mod互质,所以不用担心Mod的倍数除2后不再是Mod的倍数)。所以当K超过Mod时必然有Mod的倍数出现,那么取模后等于0。若K不超过Mod即K不超过1000003,暴力计算即可。
当然别忘了取补。