神仙zq发现了${n^2\sqrt n}\over 32$做法

Description

你有三个系数为0,1的多项式f(x),g(x),h(x)
求f(g(x)) mod h(x)
为方便起见,将答案多项式所有系数对2取模输出即可
如果f(x)=Sigma(Ak * Xk)
则f(g(x))=Sigma(Ak(g(x))K

Input

一共三行,每行一个多项式,分别为f,g,h
对于一个多项式描述为n P0,P1...Pn其中Pi为0或1
多项式P(x)=P0+P1*x+....+Pn*xn
记n表示多项式最高项的次数,n<=4000

Output

用同样的格式输出答案多项式
如果答案为0,输出0 0

题目分析

陈老师神题x1

观察到这里多项式的所有操作都是在系数$\mod 2$的意义下的,因此可以用bitset来加速多项式的一些操作。例如$O(n^2)$实现多项式取模。

 void mod(poly &a, int pos)
{
for (int i=pos; i>=p; i--)
if (a[i]) a ^= c<<(i-p), a[i] = 0;  //我第一次居然把标红地方给忘了
}

但是如同很多bitset的技巧题一样,非常重要的一点是bitset每次整体操作的复杂度是  $O(size)$  的。

这意味着$Poly\, +:O(n), \, Poly\, *:O(n^2)$

接下去我们从暴力开始谈起。

暴力做法 $O({{n^3}\over 32})$

第一个需要解决的问题是:$f(g(x))$。那么我们只需要对$g(x)$求$k$次幂(也即最暴力地k次自乘),再将这些结果相加得到多项式$f(g(x))$。至于取模的过程,则可以在每次multiply的时候顺带模干净,这样最终相加得到的结果就是在模多项式意义下的答案。

 void mod(poly &a, int pos)    //pos是a的度数
{
for (int i=pos; i>=p; i--)
if (a[i]) a ^= c<<(i-p), a[i] = ;
}
void mult(poly a, poly b, poly &ret)    //ret=a*b
{
ret.reset();
for (int i=; i<=p; i++)
if (a[i]) ret ^= b<<i;  //这里就是模拟n^2多项式乘法的过程
mod(ret, p<<);
}

总的代码:

 #include<bits/stdc++.h>
const int maxn = ;
typedef std::bitset<maxn> poly; int n,m,p;
poly a,b,c,tmp,cnt; void input(poly &a, int &n)
{
scanf("%d",&n);
for (int i=, x; i<=n; i++)
{
scanf("%d",&x);
if (x) a.set(i);
}
}
void mod(poly &a, int pos)
{
for (int i=pos; i>=p; i--)
if (a[i]) a ^= c<<(i-p), a[i] = ;
}
void mult(poly a, poly b, poly &ret)
{
ret.reset();
for (int i=; i<=p; i++)
if (a[i]) ret ^= b<<i;
mod(ret, p<<);
}
int main()
{
input(a, n), input(b, m), input(c, p);
tmp[] = , mod(b, m);
for (int i=; i<=n; i++)
{
if (a[i]) cnt ^= tmp;
mult(tmp, b, tmp);    //复杂度n^3在这里
}
while (p>=&&!cnt[p]) --p;
if (p==-) puts("0 0");
else{
printf("%d",p);
for (int i=; i<=p; i++)
printf(" %d",cnt[i]?:);
}
return ;
}

对系数按10位分块 $O({{n^3}\over 320})$

参见法老博客:[BITSET 分块] BZOJ5087. polycomp

注:md[t]并不一定要等于0.这里的取模多项式最高位对计算无影响。

容易发现这种做法的复杂度的阶仍然是$n^3$.

对$i=a\sqrt k+b$分块 $O({{n^2\sqrt n}\over 32})$

233

【bitset 技巧 分块】bzoj5087: polycomp的更多相关文章

  1. Codeforces-914F Substrings in a String (Bitset求T串中S串出现次数)

    之前有过区域赛,简化版问题: 给定一个小写字符组成的字符串S,(|S|<1e5,下标从1开始),现在有Q种操作,对于每个操作Q(Q<=1e5),输入opt, 如果opt==1,输入x,c, ...

  2. bzoj3758. 数数

    题解: 一波优秀的打表技巧 分块打表,分成1000组,打表打出来 另外10^6暴力算

  3. ACM-ICPC国际大学生程序设计竞赛北京赛区(2015)网络赛 Scores

    #1236 : Scores 时间限制:4000ms 单点时限:4000ms 内存限制:256MB 描述 Kyle is a student of Programming Monkey Element ...

  4. CTS&&APIO2019爆零记

    如果你只好奇测试相关请跳至day 2 day 3 day 6 scoi 2019 之后 ​ 由于实力问题,省选的时候排名在三十多,显然是没有进队.不过可能是受过的打击比较多,所以还没有特别颓废,甚至连 ...

  5. 个人训练记录(UPD 9.16)

    本文章记录一些较难的题,摘自自己的blog中的其他文章.也有些单独成章有点浪费的题也写在里面了. 2019.7.15-2019.7.21 1182F(2900) 题意:求在区间 \([a,b]\) 中 ...

  6. ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction hihocoder1870~1879

    ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction hihocoder1870~1879 A 签到,dfs 或者 floyd 都行. #i ...

  7. Sobol 序列并行化的实践经验

    目录 Sobol 序列并行化的实践经验 随机数发生器并行化的常见策略 Sobol 序列的原理和跳转功能 Sobol 序列并行化实践 分块策略 蛙跳策略 蛙跳策略的计算量分析 减少异或计算的技巧 分块策 ...

  8. 【分块】【bitset】hdu6085 Rikka with Candies

    给你数组A和B,A B中的元素大小都不超过5w,且两两不同. q次询问,每次给你个k,问你有多少对(i,j),满足A(i)%B(j)==k. 如题目所言模拟bitset的过程,实质上是个分块,每块的大 ...

  9. 种树 by yoyoball [树分块+bitset]

    题面 给定一棵树,有点权 每次询问给出一些点对,求这些点对之间的路径的并集上不同权值的个数,以及这些权值的$mex$ 思路 先考虑只有一对点对,只询问不同权值个数的问题:树上莫队模板题 然后加个$me ...

随机推荐

  1. JDBC连接数据以及详细的ResultSet结果集解释

    一.数据库连接 (前面为jdbc的其他参数,文章下部分为ResultSet详解) ResultSet rs = st.executeQuery(sqlStr) 1. java的sql框架支持多种数据库 ...

  2. php对数组操作的函数

    array_reverse  以相反的顺序返回数组 array_unique 数组元素去重(只对一维数组有效) array_intersect两个或多个数组取交集   implode和explode也 ...

  3. IOS在滚动的时候fixed消失

      前段时间,除了apple发布了新的硬件之外,同步还发布了新的操作系统,IOS11,当大家都将注意力聚焦在那个奇怪的刘海该如何适配的时候,笔者的项目在适配IOS11却出现了其他的问题. 众所周知,I ...

  4. MySQL无法启动Couldn't find MySQL server (/usr/bin/mysqld_safe)解决办法(来源网络)

    MySQL无法启动Couldn't find MySQL server (/usr/bin/mysqld_safe) 启动的时候,报上述错误,从这个报错来看,多半是因为读取到了另外的my.cnf导致的 ...

  5. mac mysql 编码配置

    mac mysql 编码配置 (mysql目录下没有my.cnf) 想要修改编码发现自己的/usr/local/mysql/support-files里面根本没有my.cnf 安装方式是去mysql官 ...

  6. Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) D

    Country of Metropolia is holding Olympiad of Metrpolises soon. It mean that all jury members of the ...

  7. 一行命令将ubuntu升级到最新版本

    zzupdate 是一个开源的命令行程序,通过将几个更新命令组合到一个命令中,使得将 Ubuntu 桌面和服务器版本升级到更新版本的任务变得容易一些. 将 Ubuntu 系统升级到更新的版本并不是一项 ...

  8. UML类图学习总结

    1.首先来认识下类图?以及类图的作用 类图(Class diagram)由许多(静态)说明性的模型元素(例如类.包和它们之间的关系,这些元素和它们的内容互相连接)组成.类图可以组织在(并且属于)包中, ...

  9. VS连接Access数据库--连接字符串及执行查询语句的方法(增删改查,用户名查重,根据用户获取密码查询)

    ACCESS数据的连接及语句执行操作,不难,久不用会生疏,每次都要找资料,干脆自己整理下,记录下来,需要的时候,直接查看,提高效率.也供初学者参考 1.连接字符串 public static stri ...

  10. 抓取GridView "编辑"模式下,TextBox修改后的数值

    [FAQ]抓取GridView "编辑"模式下,TextBox修改后的数值 -- ASP.NET专题实务「上集」Ch.10 抓取GridView "编辑"模式下 ...