日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【bitset 技巧 分块】bzoj5087: polycomp

發布時間:2023/12/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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

總結

以上是生活随笔為你收集整理的【bitset 技巧 分块】bzoj5087: polycomp的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。