202112-3 登机牌号码
40% 数据——直接模拟
这一部分数据满足 \(s=-1\),即校验码为空。 我们按照题目要求进行对应操作即可,大体分为以下几个步骤:
- 得到数字序列,注意不同模式的切换以及最后的补全。
- 将得到的数字转换为码字。
- 根据有效数据区每行能容纳的码字数 \(w\) 及目前码字个数,在末尾补充码字。注意不要忽略长度码字。
- 输出结果。
代码实现
100% 数据——模拟+多项式除法
这部分数据要求我们对校验码进行处理,所以步骤变为:
- 得到数字序列,注意不同模式的切换以及最后的补全。
- 将得到的数字转换为码字。
- 根据有效数据区每行能容纳的码字数 \(w\)、目前码字个数以及{\heiti{校验码的位数}},在末尾补充码字。注意不要忽略长度码字。
- 输出数据码部分结果。
- 计算得出校验码,并输出。
校验码的位数能比较方便得出,关键在于校验码的计算。考虑关键公式:
其中 \(d(x)\) 是 \(n-1\) 次多项式(已知),\(g(x)\) 是 \(k\) 次多项式(已知), 未知项有 \(q(x),r(x)\),其中 \(r(x)\) 为所求。
考虑消去 \(q(x)\) 的影响:可以在两端同时对 \(g(x)\) 取余,则 \(q(x)g(x)\) 项会被直接消去,可以化所求式为:
所以目前问题转化为求解 \(x^kd(x) \mod q(x)\)。
多项式带余除法
若 \(f(x)\) 和 \(g(x)\) 是两个多项式,且 \(g(x)\) 不等于 \(0\), 则存在唯一的多项式 \(q(x)\) 和 \(r(x)\),满足:
其中 \(r(x)\) 的次数小于 \(g(x)\) 的次数。此时 \(q(x)\) 称为 \(g(x)\) 除 \(f(x)\) 的商式,\(r(x)\) 称为余式。
多项式长除法
求解多项式带余除法的一种方法,步骤如下: 1. 把被除式、除式按某个字母作降幂排列,并把所缺的项用零补齐; 2. 用被除式的第一项除以除式第一项,得到商式的第一项; 3. 用商式的第一项去乘除式,把积写在被除式下面(同类项对齐),消去相等项,把不相等的项结合起来; 4. 把减得的差当作新的被除式,再按照上面的方法继续演算,直到余式为零或余式的次数低于除式的次数时为止。
下面展示的是一个多项式长除法的例子:
得到求解多项式带余除法的步骤后,考虑求解 \(r(x)\) 的步骤:
- 计算 \(g(x)=(x-3)(x-3^2)\cdots(x-3^k)\);
- 计算 \(x^kd(x)\);
- 计算 \(x^kd(x) \mod g(x)\),得到 \(-r(x)\);
- 对得到的每一项取反即可得到 \(r(x)\)。
计算 \(g(x)\):考虑到每一次多项式乘以的因子都是 \((x-a)\) 的格式, 所以可以把 \(A(x-a)\) 的多项式相乘转化为 \(xA-aA\) 的格式。 \(xA\) 可以通过整体移项实现;在移项后,原本在 \(x^i\) 的系数成为 \(x^{i+1}\) 的系数, 所以可以在一个数组上,从低位到高位依次计算,得到结果。
计算 \(x^kd(x)\):这部分比较简单,将低 \(k\) 位的系数赋 \(0\),再将已计算出的数据位放入对应位置即可。
计算 \(x^kd(x) \mod g(x)\):利用上文提到的多项式长除法即可。本题 \(g(x)\) 的最高位系数恒为 \(1\),简化了计算。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
|
- 背景为黄色的代码是相比部分分代码做出的改变,其它部分与部分分完全相同。