ICPC2018 青岛站 F - 构造

Posted on 2020-08-20 10:00  Choimoe  阅读(17)  评论(0)    收藏  举报

ICPC2018 青岛站 F

\(n\) 个人,要进行 \(k\) 轮决斗。
每一轮比赛你需要将这 \(n\) 个人两两配对,代表这两个人之间要进行一场决斗。
对于任意两个人,在所有 k 轮比赛中最多只能决斗一次。
若存在四个人 \(a\), \(b\), \(c\), \(d\),且 \(a\)\(b\) 在第 \(i\) 轮决斗,\(c\)\(d\) 在第 \(i\) 轮决斗,\(a\)\(c\) 在第 j 轮决斗,那么 \(b\)\(d\) 必须也在第 j 轮决斗。
构造一组方案,无解输出 Impossible
\(1 ≤ n, k ≤ 1000\),多测,\(∑n,∑k ≤ 5000\)

题解

听完才会。。感觉好nb

首先注意到 \(n\) 为奇数的时候只能进行 \(0\) 轮(没法匹配)

然后能进行的轮数只与 \(n\) 因子中的 \(2\) 个数就好了
比如 \(n=2^p*q,q=2*k+1\) 其中 \(p,k\in \mathbb N^+\) 可以拆成 \(q\) 个大小为 \(2^p\) 的组,宏观来说,如果 \(2^p\) 内都分配完无法再分配的时候,外面是奇数个组故停止

所以只需要分析 \(2^k\) 就好了
手玩一下 \(n=2,4,8\),发现对应最大的 \(k\)\(1,3,7\)
所以猜个当 \(n=2^p\) 时,\(k\) 最大为 \(2^p-1\)

证明可以考虑把一个划分的邻接矩阵画出来,发现只有上三角矩阵的左边部分(右下-左上对角线的左边部分)是有用的(剩下对称)
然后使用组合技巧就可以轻松求出

判断就是数二进制末尾0的个数就好了
构造的话需要一点二进制技巧