参考

参考题解1
上面那位博主其实说的很仔细,可能多项式有点晦涩,但理解之后发现博主确实说的挺详细的。

计算g(x)g(x)g(x)

这道题多项式的第一个难点在于如何计算多项式g(x)g(x)g(x)的各项系数。
根据题目描述,可以知道g(x)=(x−3)⋅(x−32)⋅...⋅(x−3k)g(x)=(x-3)·(x-3^2)·...·(x-3^k)g(x)=(x−3)⋅(x−32)⋅...⋅(x−3k)
我记得老师教过一个方法,就是说如果要计算括号展开后,xjx^jxj的系数aja_jaj​,那么aja_jaj​一定是由形如xm⋅xn,s.t.m+n=jx^m·x^n,s.t. m+n=jxm⋅xn,s.t.m+n=j这些幂次构成的,所以某一项的系数其实由下面给出:aj=∑∀m,n,m+n=jam⋅ana_j=\sum_{{{\forall}}m,n, \\m+n=j}a_m·a_naj​=∀m,n,m+n=j∑​am​⋅an​

但一口气算完是不现实的,其实可以按照两个括号两个括号的逐次合并。一共有kkk个括号,那么需要合并k−1k-1k−1次。

比如我们先合并q2(x)=(x−3)⋅(x−32)q_2(x)=(x-3)·(x-3^2)q2​(x)=(x−3)⋅(x−32),
再合并q3(x)=q2(x)⋅(x−33)q_3(x)=q_2(x)·(x-3^3)q3​(x)=q2​(x)⋅(x−33)于是变成了一个动态规划。这道题可以看到,含有xxx的每个括号其次数都为1,那么就可以先确定出初始状态G[k]=−3,G[k−1]=1G[k]=-3,G[k-1]=1G[k]=−3,G[k−1]=1

我们欲从低次(x−3)(x-3)(x−3)推的xkx^kxk的系数G[0]G[0]G[0],从而确定出每一次数的系数。

再以上面合并q2(x)=(x−3)(x−32)q_2(x)=(x-3)(x-3^2)q2​(x)=(x−3)(x−32)时为例,可以看到这两项合并最高次数为2,并且只能由x⋅xx·xx⋅x构成。所以可以填入G[k−2]=1G[k-2]=1G[k−2]=1

由于当前合并的是第1个括号和第2个括号,那么此时还有i=0,所以准确来说是G[k−2−i]=1G[k-2-i]=1G[k−2−i]=1

对于q2(x)q_2(x)q2​(x)的其他幂次,比如x=x1x=x^1x=x1,那么q2(x)q_2(x)q2​(x)的一次项系数,它可以由第一个括号的x乘上第二个括号的系数(−9-9−9),和第二个括号的xxx乘上第一个括号的系数(−3)(-3)(−3)相加得到。
按道理来说这里如果括号里也是个多项式,那就很麻烦了,好在他每个括号都是一次的。所以合并之后的xjx_jxj​一定来自于先前xjx_jxj​的系数乘上待合并括号的常数,再加上原来xj−1x_{j-1}xj−1​的系数乘上新括号xxx的系数(恒等于1)相加得到。

为了代码实现,所以在每次合并括号,都会先记录一下当前多项式,以免覆盖。

多项式相除

这便是第二个难点了。我比较笨,看着博主代码想了很久。事实上代码的多项式相除比手算简便,因为手算还需要确定该乘多少次才能对其。但事实上,代码实现时,只关心当前该乘多少系数,也就是当前被除数最高位的系数。

因为我们用数组来表示多项式了,乘xxx的幂次的操作不过是数组的对其方式罢了。事实上用第0位表示当前多项式最高次,就隐含了对齐这个操作了。

存放checksum

按道理可以在D(x)D(x)D(x)上原地更新存放校验码,但是直接将D(x)D(x)D(x)多开几位(k−1k-1k−1次多项式便是长度为k的数组)使得k-1次多项式能够存下就好了,以免折腾。

到此这道题就完成的差不多了。

代码

#include <iostream>
#include <vector>
#include <valarray>using namespace std;
int w, s;
int UPPER = 0;
int LOWER = 1;
int DIGIT = 2;void
coding(string &input, vector<int> &vec) {int state = UPPER;for (int i = 0; i < input.length(); ++i) {if ('A' <= input[i] && input[i] <= 'Z') {// UPPERif (state == LOWER) {// LOWER -> DIGIT -> UPPERvec.push_back(28);vec.push_back(28);} else if (state == DIGIT) {vec.push_back(28);}vec.push_back(input[i] - 'A');state = UPPER;} else if ('a' <= input[i] && input[i] <= 'z') {if (state != LOWER) {vec.push_back(27);}vec.push_back(input[i] - 'a');state = LOWER;} else if ('0' <= input[i] && input[i] <= '9') {if (state != DIGIT) {vec.push_back(28);}vec.push_back(input[i] - '0');state = DIGIT;}}
}int mazi(int a, int b) {return 30 * a + b;
}void
mazi(vector<int> &code, vector<int> &ma) {for (int i = 0; i < code.size(); i += 2) {ma.push_back(mazi(code[i], code[i + 1]));}}ostream &operator<<(ostream &os, vector<int> &m) {for (auto &x: m) {cout << x << "\n";}return os;
}int MOD = 929;int main() {cin >> w >> s;string raw_str;cin >> raw_str;vector<int> coded;coding(raw_str, coded);if (coded.size() % 2 == 1) {coded.push_back(29);}vector<int> mazied;mazi(coded, mazied);int k = s != -1  ? pow(2, s + 1)  : 0;while ((mazied.size() + k + 1) % w != 0) {mazied.push_back(900);}cout << mazied.size() + 1 << "\n";if (s != -1) {// construct k polynomial, G[0] means the x^k, G[1] means x^{k-1}, ..., x^2, x ,Cvector<int> G(k + 1, 0);G[k] = -3;G[k - 1] = 1;// (x^2 - 9)int tmp_C = -9;// calc our G(x), follow (x-3) * (x-3^2) ..for (int i = 0; i < k - 1; ++i) {vector<int> old_G(k + 1);for (int j = k - i - 1; j <= k; ++j) {old_G[j] = G[j];}/*** for example:* (x-3)(x-3^2)* we know G[k] = -3,G[k-1] = 1 ( as we see (x-3) here)* then going to multiply to (x^2 - 9) (why tmp_C = - 9 here)* update C(x^1) = G[k-1] = -9 + (-3) = G[k-1] * tmp_C + G[k-2] = G[k-1] * tmp_C + old_G[k]* */for (int j = k - i - 1; j <= k; ++j) {G[j] = (G[j] % MOD) * (tmp_C % MOD) % MOD;}for (int j = k - i - 1; j < k; ++j) {// consider lower index will also construct thisG[j] += old_G[j + 1] % MOD;}// as we multiply each loop,// the current highest must construct by all x param, so must be 1G[k - i - 2] = 1;tmp_C *= 3;tmp_C %= MOD;}vector<int> D(mazied.size() + 1 + k,0);D[0] = mazied.size() + 1;for (int i = 0; i < mazied.size(); ++i) {D[i+1] = mazied[i];D[i+1] %= MOD;}auto polynomial_divide = [&k, &mazied](vector<int> &Dx, vector<int> &Gx) {/*** Dx/Gx* */// the divide means, we will align the low index to high poly index,// so for each param in Gx, we will multiply them as D(x) current high poly param// i=0 for the highest indexfor (int i = 0; i < Dx.size() - k; ++i) {int current_C = Dx[i];// multiply all poly in Gx by C// Gx[0] is x^kfor (int j = 0; j < Gx.size(); ++j) {Dx[i + j] = Dx[i + j] - ((Gx[j] * current_C) % MOD);Dx[i + j] %= MOD;}}//update checksumfor (long long i = Dx.size() - Gx.size() + 1; i < Dx.size(); ++i) {if (-Dx[i] < 0)mazied.push_back(MOD+ (-Dx[i] % MOD));elsemazied.push_back(-Dx[i] % MOD);}
//            cout << Gx;};
//        cout << "D=" << D;
//        cout << "G=" << G;polynomial_divide(D, G);}cout << mazied;
}

CSP-202112-3-登机牌相关推荐

  1. CSP 202112-3 登机牌条码 40分

    2022.3.4 练习 CSP 202112-3 登机牌条码 之前在考场上只拿了20分,就是因为没仔细看题:在编码开始时,编码器处于大写字母模式,没有考虑这个情况...血泪啊 #include < ...

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

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

  3. CSP登机牌条码202112-3

    改思路了,这题真难写,后半部分看不懂,所以我决定只过它的一二测试点,拿40分 #include <bits/stdc++.h> using namespace std;int main() ...

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

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

  5. ccf-csp:202112

    篇幅关系把2021年12月份的发在一篇博客里了 这一次csp拿分情况100+100+40+25+36,最后一题正常暴力应该是拿12分,于是乎我又针对特殊情况暴力了六个点,一共过了9个点拿了36(有点不 ...

  6. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  7. Go 分布式学习利器(19)-- Go并发编程 之 CSP(communicating sequential processes) 机制

    文章目录 前言 CSP 特点 CSP代码 演示 1. 正常流程的代码 2. CSP 未设置buffer 代码 3. 设置指定大小的channel buffer 总结 前言 CSP 这个名词大家会比较陌 ...

  8. 考csp所需算法_CSP vs RxJS:您所不知道的。

    考csp所需算法 by Kevin Ghadyani 通过凯文·加迪亚尼(Kevin Ghadyani) CSP vs RxJS:您所不知道的. (CSP vs RxJS: what you don' ...

  9. CSP浏览器安全策略备忘

    挺久之前过了一遍CSP的安全策略,很多人把它喻为XSS攻击的终结者,因为这种策略不再像传统只靠各种正则和特征匹配来识别跨站攻击Payload,而是直接从协议层把一些存在安全隐患的用法默认给干掉了,把同 ...

  10. [译] 在 Facebook 发一张登机牌,你就有可能被盗号了

    原文地址:Post a boarding pass on Facebook, get your account stolen 原文作者:Michal Špaček 译文出自:掘金翻译计划 本文永久链接 ...

最新文章

  1. 拼接字符SQL语句拼接 最后一个字符多出 处理方式
  2. HQL中的substring
  3. 字符串表达式求值 C#实现
  4. (转)Hibernate框架基础——映射主键属性
  5. JSP ---- 入门
  6. 一道非齐次方程组解的判定习题--行向量
  7. 小程序不同页面之间通讯的解决方案 1
  8. html两个自然段怎么写,春天作文二个自然段
  9. 使用二维数组打印一个 10 行杨辉三角
  10. JDK环境变量的两种配置方法——以JDK8和JDK10为例
  11. All clients has disconnected from. You can graceful shutdown now., dubbo version: , current host
  12. Python招聘岗位信息聚合系统源码(爬虫爬取、数据分析、可视化、互动等功能)...
  13. 计算机产品选型与配置,高校校园网设备的选型和配置.DOC
  14. SSH登录及失败解决
  15. 使用TWRP Recovery刷入CM13等第三方ROM教程
  16. 漫画网站服务器,建立家庭漫画服务器,从iPad上看漫画
  17. sklearn专题五:逻辑回归
  18. 二叉树非递归后序遍历的三种办法
  19. nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 的解决办法
  20. 制作二维码怎么做?手把手教你制作生成二维码

热门文章

  1. 现货会比期货价格高吗(为什么现货比期货贵)
  2. 吹响集结的号角:O'Reilly和Intel人工智能大会北京站在召唤!
  3. 辣椒籽的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  4. Infrared Small Target Detection 2021
  5. STM8自学入门方向
  6. 信道仿真之加一定信噪比的带限高斯白噪声
  7. module ‘selenium.webdriver‘ has no attribute ‘PhantomJS‘
  8. Mobl试用之helloword
  9. 在新浪SAE上部署应用实战心得
  10. ‘XXX‘ is missing the class attribute ‘ExtensionOfNativeClass‘!