题目描述

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登机牌条码相关推荐

  1. CSP202112——T3登机牌条码

    其实题目已经给了模拟思路了: 计算数据码字.填充码字和长度码字(注意特判s==-1的时候) 计算校验码字,主要是一个多项式求余 数据码字 按题意模拟,解析字符串,得到编码值,如果长度是奇数就在加个29 ...

  2. CSP CCF: 202112-3 登机牌条码 (C++)

    题目来源: 计算机软件能力认证考试系统 问题描述 试题编号: 202112-3 试题名称: 登机牌条码 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 题目背景 西西艾弗岛景色优美,游人 ...

  3. CSP202112-3登机牌条码

    目录 思路 模拟 输入模式处理 求长度码字,有效数据码字,填充码字 校验码字的求取 求gx(多项式乘法) 求x^n*dx 求校验码字 总结 原题太长就挂个链接CSP202112-3登机牌条码 思路 其 ...

  4. CCF-CSP 202112-3登机牌条码 解题思路+满分题解+详细注释

    CCF-CSP 202112-3登机牌条码 解题思路+满分题解+详细注释 题目链接:202112-3登机牌条码 思路: 第一步:按照题目顺序进行处理,即首先处理字符串,将对应的字符串转换成相应的数字编 ...

  5. CCF-CSP-202112-3:登机牌条码(C++11题解)

    文章目录 问题描述 解题思路 数学基础 模拟思路 得分技巧 AC代码 问题描述 题目来源:CCF-CSP-202112-3:登机牌条码 解题思路 数学基础 需要一些很简单的数论基础知识(主要是同余的知 ...

  6. 【CCF-CSP】202112-3 登机牌条码

    题目 202112-3 登机牌条码 代码 #include<bits/stdc++.h> using namespace std; const int N = 100010;int mai ...

  7. 登机牌条码(python)

    在ccfcsp官网(登机牌条码)的样例都能通过,但找半天没找到只有50分的原因. 主要的思路就是: 一.计算g(x)为了方便用的就是模拟人工计算. 二.计算长除法. 注释也很详细,希望有xd找到问题了 ...

  8. CCF-CSP 202112-3 登机牌条码 100分

    原题链接:CCF-CSP 202112-3 登机牌条码 参考博客: CSP 202112-3 登机牌条码 CSP 202112-3 登机牌条码 (详细图解) #include <bits/std ...

  9. java规则计算_java实现的霍纳规则的多项式计算

    java实现的霍纳规则的多项式计算 霍纳规则多项式计算如果使用朴素的多项式求值,时间复杂度为O(n*n),而是用了霍纳规则可以使用递归或者迭代来实现,时间复杂度是O(n),下面是源代码: /* * 实 ...

最新文章

  1. 输出php数组结构,在PHP中输出数组结构使用 函数 。
  2. 成功解决 AttributeError: module 'tensorflow' has no attribute 'sub'
  3. windows文件保护_Windows系统下媲美时间机器的系统备份工具,统统免费
  4. 改变图像的对比度和亮度
  5. 提升效率之串口监控工具
  6. 论文查重软件检测报告怎么看?
  7. 利用arcgis软件画地图
  8. 云知声-AI离线语音识别芯片模块系列方案介绍
  9. 计算机考试相关证书 (一)
  10. inprivate浏览是什么意思_inprivate浏览是什么意思,怎样关闭inprivate浏览器
  11. 在VMware虚拟机环境下为msdos7.1安装masm
  12. 苹果 App Clip 技术详解
  13. bmp格式如何转换成png格式
  14. Pyton学习—循环语句
  15. 打印机不能正常打印怎么办
  16. html怎么去除照片背景颜色,怎么去掉背景色?
  17. Pytorch-RuntimeError: size mismatch m1: [a x b], m2: [c x d]
  18. MySQL数据库的InnoDB引擎TableSpaceExists问题解决
  19. Python处理示波器CSV表格数据、微软excel格式数据
  20. 产品经理必用的13款工具

热门文章

  1. 移动支付新发展:开拓支付领域,不止于支付服务
  2. 基于自定义注解校验入参Model中的必传字段
  3. base.apk软件下载免费_PS软件各版本免费下载地址
  4. 域名价值排行,最贵的你意想不到
  5. 什么是开源?为什么要坚持开源?
  6. STM32实现红外感应传感器功能
  7. B4:Unity制作Moba类游戏——小兵AI系统
  8. HTML css js成长路程
  9. matlab三维显示圆锥,基于MATLAB和SOLIDWORKS的弧齿锥齿轮三维精确建模
  10. 电脑装两块网卡,如何设置双网卡实现内外网都上