神仙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. Centos7中给gitLab汉化

    第一步:安装git 下载补西,东西在清华大学开源中心 yum install –y git 第二步:下载 git clone https://gitlab.com/xhang/gitlab.git 第 ...

  2. NetCore + Mysql + EF:No coercion operator is defined between types 'System.Int16' and 'System.Boolean',

    总结三种解决办法: 1.Mysql升级到7 2.Nuget安装Pomelo.EntityFrameworkCore.MySql 2.2.0替代MySql.Data.EntityFrameworkCor ...

  3. 关于java后台接入百度地图返回参数为{"status":211,"message":"APP SN校验失败"}的解决方法

    1.关于百度地图,天气预报,微信公众平台等一系列权威机构java接入的认识: a.首先要认识到的是这些信息都属于外部接口,我们在进行接入的时候一定要注意到这些接口的参数设置,稍微一不留神就会出现接入失 ...

  4. NET Core 2.1 Preview 1

    NET Core 2.1 Preview 1 [翻译] .NET Core 2.1 Preview 1 发布 原文: Announcing .NET Core 2.1 Preview 1 今天,我们宣 ...

  5. 将JWT与Spring Security OAuth结合使用

    1.概述 在本教程中,我们将讨论如何使用Spring Security OAuth2实现来使用JSON Web令牌. 我们还将继续构建此OAuth系列的上一篇文章. 2. Maven配置 首先,我们需 ...

  6. XML文件的一些操作

    XML 是被设计用来传输和存储数据的, XML 必须含有且仅有一个 根节点元素(没有根节点会报错) 源码下载 http://pan.baidu.com/s/1ge2lpM7 好了,我们 先看一个 XM ...

  7. Ubuntu 修改host并重启网络

    Ubuntu系统的Hosts只需修改/etc/hosts文件,在目录中还有一个hosts.conf文件,刚开始还以为只需要修改这个就可以了,结果发现是需要修改hosts.修改完之后要重启网络.具体过程 ...

  8. 干货|java缓存技术详解

    一.缓存是什么? 请点击此处输入图片描述 Cache ①高速缓冲存储器,其中复制了频繁使用的数据以利于快速访问. ②位于速度相差较大的两种硬件/软件之间,用于协调两者数据传输速度差异的结构 二.缓存有 ...

  9. SequenceFile和MapFile

    HDFS和MR主要针对大数据文件来设计,在小文件处理上效率低.解决方法是选择一个容器,将这些小文件包装起来,将整个文件作为一条记录,可以获取更高效率的储存和处理,避免多次打开关闭流耗费计算资源.hdf ...

  10. Python中的绝对路径和相对路径

    大牛们应该对路径都很了解了,这篇文章主要给像我这样的入门小白普及常识用的,啊哈 下面的路径介绍针对windows,其他平台的暂时不是很了解. 在编写的py文件中打开文件的时候经常见到下面其中路径的表达 ...