【bitset 技巧 分塊】bzoj5087: polycomp

神仙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)$實現多項式取模。

1 void mod(poly &a, int pos)
2 {
3     for (int i=pos; i>=p; i--)
4         if (a[i]) a ^= c<<(i-p), a[i] = 0;  //我第一次居然把標紅地方給忘了
5 }

但是如同很多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的時候順帶模干凈,這樣最終相加得到的結果就是在模多項式意義下的答案。

 1 void mod(poly &a, int pos)    //pos是a的度數
 2 {
 3     for (int i=pos; i>=p; i--)
 4         if (a[i]) a ^= c<<(i-p), a[i] = 0;
 5 }
 6 void mult(poly a, poly b, poly &ret)    //ret=a*b
 7 {
 8     ret.reset();
 9     for (int i=0; i<=p; i++)
10         if (a[i]) ret ^= b<<i;  //這里就是模擬n^2多項式乘法的過程
11     mod(ret, p<<1);
12 }

總的代碼:

 1 #include<bits/stdc++.h>
 2 const int maxn = 8035;
 3 typedef std::bitset<maxn> poly;
 4 
 5 int n,m,p;
 6 poly a,b,c,tmp,cnt;
 7 
 8 void input(poly &a, int &n)
 9 {
10     scanf("%d",&n);
11     for (int i=0, x; i<=n; i++)
12     {
13         scanf("%d",&x);
14         if (x) a.set(i);
15     }
16 }
17 void mod(poly &a, int pos)
18 {
19     for (int i=pos; i>=p; i--)
20         if (a[i]) a ^= c<<(i-p), a[i] = 0;
21 }
22 void mult(poly a, poly b, poly &ret)
23 {
24     ret.reset();
25     for (int i=0; i<=p; i++)
26         if (a[i]) ret ^= b<<i;
27     mod(ret, p<<1);
28 }
29 int main()
30 {
31     input(a, n), input(b, m), input(c, p);
32     tmp[0] = 1, mod(b, m);
33     for (int i=0; i<=n; i++)
34     {
35         if (a[i]) cnt ^= tmp;
36         mult(tmp, b, tmp);    //復雜度n^3在這里
37     }
38     while (p>=0&&!cnt[p]) --p;
39     if (p==-1) puts("0 0");
40     else{
41         printf("%d",p);
42         for (int i=0; i<=p; i++)
43             printf(" %d",cnt[i]?1:0);
44     }
45     return 0;
46 } 

對系數按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

轉載于:https://www.cnblogs.com/antiquality/p/10507033.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249487.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

day 012 生成器 與 列表推導式

生成器的本質就是迭代器&#xff0c;寫法和迭代器不一樣&#xff0c;用法一樣。 獲取方法&#xff1a; 1、通過生成器函數 2、通過各種推導式來實現生成器 3、通過數據的轉換也可以獲取生成器 例如&#xff1a; 更改return 為 yield 即成為生成器 該函數就成為了一個生成器函數…

數據庫設計注意事項和原則

引言數據庫設計是信息系統設計的基礎&#xff0c;一個好的數據庫設計在滿足了軟件需求之外&#xff0c;還要易維護、易擴充等等要求。當然&#xff0c;對專家們反復強調的數據的一致性、冗余性、訪問效率等問題的解決&#xff0c;很大程度上取決于數據庫設計者的經驗和專業水平…

【AtCoder】ARC078

C - Splitting Pile 枚舉從哪里開始分的即可 #include <bits/stdc.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar( ) #define enter putchar(\n) #define MAXN 200005 #defi…

20172325 2018-2019-1 《Java程序設計》第二周學習總結

20172325 2018-2019-1 《Java程序設計》第二周學習總結 教材學習內容總結 3.1集合 集合是一種聚集、組織了其他對象的對象。集合可以分為兩大類&#xff1a;線性集合和非線性集合。線性集合&#xff1a;一種其元素按照直線方式組織的集合。非線性集合&#xff1a;一種其元素按某…

數據庫視圖

測試表:user有id&#xff0c;name&#xff0c;age&#xff0c;sex字段 測試表:goods有id&#xff0c;name&#xff0c;price字段 測試表:ug有id&#xff0c;userid&#xff0c;goodsid字段 視圖的作用實在是太強大了&#xff0c;以下是我體驗過的好處&#xff1a; 作用一&…

題解 luogu P2568 GCD

題解 luogu P2568 GCD 時間&#xff1a;2019.3.11 歐拉函數前綴和 題目描述 給定整數\(N\)&#xff0c;求\(1\le x,y \le N\)且\(\gcd(x,y)\)為素數的數對\((x,y)\)有多少對. 分析 枚舉素數\(p\), 先求出\(1\le x,y \le \left \lfloor \dfrac n p \right \rfloor\)且\(\gcd(x, …

解決前后臺發送請求或者接口之間發送請求亂碼的問題

前后臺傳中文亂碼&#xff1a; 前臺使用encodeURI 進行編碼 后臺使用decode進行解碼 如果接口之間調用出現亂碼.接收方是&#xff1f;&#xff1f;&#xff1f;&#xff1f;這種。傳送方式明文的處理方式&#xff1a; 發送方使用decode 進行編碼&#xff1a; 接收方使用的ecod…

MSDN幫助文檔 無法顯示該網頁 的問題解決方案(轉)

MSDN幫助文檔 "無法顯示該網頁" 的問題解決方案 以前就遇到過這樣的問題&#xff0c;還以為是IE7導致的。后來重新安裝了IE7也沒有解決。后來就重新安裝MSDN了&#xff0c;非常郁悶。今天終于知道原因了。因為開了HijackThis刪除了一些注冊協議&#xff0c;然后發現M…

.net Core發布至IIS完全手冊帶各種踩坑

服務器環境配置 和各位大爺報告一下我的服務器環境 : Windows Server 2012 iis 8 小插曲開始: 運維大哥在昨天給了我一臺新的server 0環境開始搭建 。 并且沒有安裝任何的系統補丁。 第一件事情請開始打 補丁 打完補丁之后有時補丁會不完全 ,所以需要去官網獲取補丁: KB2919355…

Unity --- MeshRenderer之網格合并

創建如圖所示的對象結構,parent為空對象&#xff0c;然后將下面的代碼掛載到parent對象上運行即可。 1 using UnityEngine;2 using System.Collections;3 4 public class CombineMeshAndMaterials : MonoBehaviour5 {6 void Start()7 {8 CombineMesh();9 }…

css 盒模型的屬性

1、盒模型 2、display 3、浮動轉載于:https://www.cnblogs.com/Tang854416/p/9676424.html

前后端分離

、前后端分離的好處 &#xff08;1&#xff09;徹底解放前端 &#xff08;2&#xff09;提高工作效率&#xff0c;分工更加明確。 &#xff08;3&#xff09;局部性能提升 &#xff08;4&#xff09;降低維護成本 2、前后端分離的概念 后臺只需要提供API接口&#xff0c;…

Win10還原被Windows Defender隔離的文件

Win10最新版本的Windows Defender隔離/刪除的文件沒有還原的選項&#xff0c;導致很多破解文件或是注冊機直接隔離&#xff0c;到威脅歷史記錄中去卻無法恢復。經過各個嘗試&#xff0c;到微軟官方論壇中也嘗試了很多方法&#xff0c;后來發現竟然恢復啦。各位小伙伴可以試試這…

AtCoder Grand Contest 013 題解

A - Sorted Arrays 貪心&#xff0c;看看不下降和不上升最長能到哪&#xff0c;直接轉移過去即可。 1 //waz2 #include <bits/stdc.h>3 4 using namespace std;5 6 #define mp make_pair7 #define pb push_back8 #define fi first9 #define se second 10 #define ALL(x…

servlet架構解析

https://www.jianshu.com/p/d433b5fb87e2

(Review cs231n) Backpropagation and Neural Network

損失由兩部分組成&#xff1a; 數據損失正則化損失&#xff08;data loss regularization&#xff09; 想得到損失函數關于權值矩陣W的梯度表達式&#xff0c;然后進性優化操作&#xff08;損失相當于海拔&#xff0c;你在山上的位置相當于W&#xff0c;你進行移動&#xff0c…

springboot restful

https://www.jianshu.com/p/733d788ea94d

【計算機算法設計與分析】——排序

一.排序 二.插入排序 &#xff08;1&#xff09;算法描述 &#xff08;2&#xff09;性能分析 &#xff08;3&#xff09;尋求優化 三.歸并排序 &#xff08;1&#xff09;算法思想 &#xff08;2&#xff09;性能分析 &#xff08;2&#xff09;示例 &#xff08;3&#xff09…

QT 隨機數生成

下面總結了QT中隨機生成的方法&#xff08;僅供學習參考&#xff09;&#xff0c;分為舊方法和新方法&#xff0c;一般來說&#xff0c;舊的方法已經被拋棄&#xff0c;在開發新的應用中推薦使用新方法。 C Code 123456789101112131415161718192021222324#include <QCoreApp…

獲取/設置IFRAME內對象元素的幾種JS方法

獲取/設置IFRAME內對象元素的幾種JS方法 iframe瀏覽器ie文檔微軟&#xff11;。IE專用(通過frames索引形象定位)&#xff1a; document.frames[i].document.getElementById(元素的ID); &#xff12;。IE專用(通過IFRAME名稱形象定位)&#xff1a; document.frames[iframe的name…