多项式计算大模拟:csp202112-3登机牌条码
题目描述
csp202112-3
题目分析
- 本题有两部分模拟,一部分是计算数据码字,一部分是计算校验码字。
- 数据码字的计算比较简单,写个简单的状态机生成一系列数字之后两两组合即可获得数据区。测试样例也比较“善良”,可以直接过40分。
- 校验码字考场上直接没看明白,看博主题解才发现就是模拟多项式乘除法。之前没有怎么接触过多项式乘除法的计算,这次也算是新技能get了。
校验码字的计算
题目给出的校验码字的定义形式如下。
考场上首要任务是不要被看起来繁杂的数学式子吓到,仔细观察会发现式子里很多系数都是已知的,如gx的各项系数,dx的各项系数(就是包括长度信息的数据码字)。表面上有两个未知多项式qx和rx,实际恒等式是一个带余除法的形式,即 xkd(x)/g(x)x^kd(x)/g(x)xkd(x)/g(x) ,qx是商,-rx是余数。直接模拟竖式除法即可。多项式的各项系数直接使用vector存放。需要注意的是所有的运算都要在模运算意义下(MOD=929)进行,否则过程中的系数可能会很大。
细节
- 式子有一个坑,余数是 -rx 而不是 rx,因此结果需要取rx每一项系数的相反数再取模;这里会引出的另一个问题是关于负数模的定义问题,C++中负数模的结果仍是负数,如下:
因此结果的正确表达式是(MOD - rx_i) % MOD
(而不是abs((- dx[i]) % MOD)
),即先对rx_i的相反数加上一个MOD,使其变为正数,再取模即可(而不是先取模再求绝对值)。 - 过程中的所有系数(包括临时变量_3pow),都需要在模意义下进行,否则会爆int(实测long long也会爆)。
AC代码
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
#define UPPER 0
#define LOWER 1
#define DIGIT 2
#define MOD 929
vector<int> raw, res;
int main() {int w, s, state = UPPER;scanf("%d%d", &w, &s);int k = 2 << s;string str;cin >> str;res.push_back(0); // lengthfor (int i = 0; i < str.length(); ) {char this_char = str[i];switch (state) {case UPPER:if (this_char >= 'A' && this_char <= 'Z') {raw.push_back(this_char - 'A');i++;}else if (this_char >= 'a' && this_char <= 'z') {raw.push_back(27);state = LOWER;}else {raw.push_back(28);state = DIGIT;}break;case LOWER:if (this_char >= 'A' && this_char <= 'Z') {raw.push_back(28);state = DIGIT;}else if (this_char >= 'a' && this_char <= 'z') {raw.push_back(this_char - 'a');i++;}else {raw.push_back(28);state = DIGIT;}break;case DIGIT:if (this_char >= 'A' && this_char <= 'Z') {raw.push_back(28);state = UPPER;}else if (this_char >= 'a' && this_char <= 'z') {raw.push_back(27);state = LOWER;}else {raw.push_back(this_char - '0');i++;}break;default: ;}}if (raw.size() % 2) raw.push_back(29);for (int i = 0; i < raw.size(); i += 2) {res.push_back(raw[i] * 30 + raw[i+1]);}while (s == -1 ? res.size() % w : (res.size() + k) % w) {res.push_back(900);}res[0] = res.size();vector<int> gx(k+1, 0);gx[0] = -3;gx[1] = 1;int _3pow = - 3 * 3;for (int i = 2; i <= k; i++) {vector<int> prev_gx(gx);gx[0] = (gx[0] * _3pow) % MOD;for (int j = 1; j <= i; j++) {gx[j] = (prev_gx[j-1] + (prev_gx[j] * _3pow) % MOD) % MOD;}_3pow *= 3; // 低级错误2_3pow %= MOD; // 低级错误3}int n = res[0];vector<int> dx(n+k, 0);for (int i = 0; i < n; i++) {dx[i+k] = res[n-1-i] % MOD;}for (int i = k+n-1; i >= k; i--) {int para = dx[i];for (int j = k, ii = i; j >= 0; j--, ii--) {dx[ii] = (dx[ii] - (gx[j] * para % MOD)) % MOD;}}for (int i = k-1; i >= 0; i--) res.push_back((MOD - dx[i]) % MOD); // 低级错误1for (int i = 0; i < res.size(); i++) {printf("%d\n", res[i]);}return 0;
}
多项式计算大模拟:csp202112-3登机牌条码相关推荐
- CSP202112——T3登机牌条码
其实题目已经给了模拟思路了: 计算数据码字.填充码字和长度码字(注意特判s==-1的时候) 计算校验码字,主要是一个多项式求余 数据码字 按题意模拟,解析字符串,得到编码值,如果长度是奇数就在加个29 ...
- CSP CCF: 202112-3 登机牌条码 (C++)
题目来源: 计算机软件能力认证考试系统 问题描述 试题编号: 202112-3 试题名称: 登机牌条码 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 题目背景 西西艾弗岛景色优美,游人 ...
- CSP202112-3登机牌条码
目录 思路 模拟 输入模式处理 求长度码字,有效数据码字,填充码字 校验码字的求取 求gx(多项式乘法) 求x^n*dx 求校验码字 总结 原题太长就挂个链接CSP202112-3登机牌条码 思路 其 ...
- CCF-CSP 202112-3登机牌条码 解题思路+满分题解+详细注释
CCF-CSP 202112-3登机牌条码 解题思路+满分题解+详细注释 题目链接:202112-3登机牌条码 思路: 第一步:按照题目顺序进行处理,即首先处理字符串,将对应的字符串转换成相应的数字编 ...
- CCF-CSP-202112-3:登机牌条码(C++11题解)
文章目录 问题描述 解题思路 数学基础 模拟思路 得分技巧 AC代码 问题描述 题目来源:CCF-CSP-202112-3:登机牌条码 解题思路 数学基础 需要一些很简单的数论基础知识(主要是同余的知 ...
- 【CCF-CSP】202112-3 登机牌条码
题目 202112-3 登机牌条码 代码 #include<bits/stdc++.h> using namespace std; const int N = 100010;int mai ...
- 登机牌条码(python)
在ccfcsp官网(登机牌条码)的样例都能通过,但找半天没找到只有50分的原因. 主要的思路就是: 一.计算g(x)为了方便用的就是模拟人工计算. 二.计算长除法. 注释也很详细,希望有xd找到问题了 ...
- CCF-CSP 202112-3 登机牌条码 100分
原题链接:CCF-CSP 202112-3 登机牌条码 参考博客: CSP 202112-3 登机牌条码 CSP 202112-3 登机牌条码 (详细图解) #include <bits/std ...
- java规则计算_java实现的霍纳规则的多项式计算
java实现的霍纳规则的多项式计算 霍纳规则多项式计算如果使用朴素的多项式求值,时间复杂度为O(n*n),而是用了霍纳规则可以使用递归或者迭代来实现,时间复杂度是O(n),下面是源代码: /* * 实 ...
最新文章
- 输出php数组结构,在PHP中输出数组结构使用 函数 。
- 成功解决 AttributeError: module 'tensorflow' has no attribute 'sub'
- windows文件保护_Windows系统下媲美时间机器的系统备份工具,统统免费
- 改变图像的对比度和亮度
- 提升效率之串口监控工具
- 论文查重软件检测报告怎么看?
- 利用arcgis软件画地图
- 云知声-AI离线语音识别芯片模块系列方案介绍
- 计算机考试相关证书 (一)
- inprivate浏览是什么意思_inprivate浏览是什么意思,怎样关闭inprivate浏览器
- 在VMware虚拟机环境下为msdos7.1安装masm
- 苹果 App Clip 技术详解
- bmp格式如何转换成png格式
- Pyton学习—循环语句
- 打印机不能正常打印怎么办
- html怎么去除照片背景颜色,怎么去掉背景色?
- Pytorch-RuntimeError: size mismatch m1: [a x b], m2: [c x d]
- MySQL数据库的InnoDB引擎TableSpaceExists问题解决
- Python处理示波器CSV表格数据、微软excel格式数据
- 产品经理必用的13款工具