<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      FWT學習筆記

      快速沃爾什變換學習筆記

      (如果寫錯了請糾正)(表達不到位請多多包涵)


      \(or\)

      \(f[i][x]\)表示第\(i+1\)位到第\(n\)位相同,第\(1\)位到第\(i\)位是\(x\)的子集的\(a[y]\)的和

      于是FMT后的數組就是 \(f[n][x]\)

      考慮如何計算\(f[i][x]\)

      如果\(x\)的第\(i\)位是\(0\),那么\(f[i][x]=f[i-1][x]\)

      如果是\(1\),那么\(f[i][x]=f[i-1][x]+f[i-1][x-2^{i-1}]\)

      用滾動數組優化可以做到空間復雜度\(O(n)\)

      對于第\(i\)層來說,相當于把整個序列分成了\(2^{n-i}\)

      每一段中的第\(i+1\)位到第\(n\)位相同,且每段左半段第\(i\)位是\(0\),右半段第\(i\)位是\(1\),相當于左半段對右半段對應的位置產生了貢獻

      代碼就很容易寫出來了(_)

      FMT的逆變換

      與正變換類似,\(f[i][x]\)表示第\(i+1\)位到第\(n\)位是\(x\)的子集,且第\(1\)位到第\(i\)位相等的\(a[y]\)的和

      如果\(x\)的第\(i\)位是\(0\),那么\(f[i][x]=f[i-1][x]\)

      如果是\(1\),那么\(f[i][x]=f[i-1][x]-f[i-1][x-2^{i-1}]\)

      是不是很簡單(_)


      \(and\)

      \(or\)的本質相同


      \(xor\)

      這個就比較難了

      也叫集合的對稱差卷積

      定義 \(h=f \cdot g\)

      \(h_S= \sum_{L \subseteq 2^U}\sum_{R \subseteq 2^U}[L \oplus R=S]f_Lg_R\)

      首先注意到對于集合 \(S\)

      \(\frac{1}{2^n}\sum_{T \subseteq 2^U} (-1)^{|S \cap T|} = [ S= \varnothing ]\)

      這樣

      \(h_S= \sum_{L \subseteq 2^U}\sum_{R \subseteq 2^U}[L \oplus R \oplus S = \varnothing]f_L g_R\)

      \(=\sum_{L \subseteq 2^U}\sum_{R \subseteq 2^U} \frac{1}{2^n} \sum_{T \subseteq 2^U}(-1)^{|T \cap (L \oplus R \oplus S)|}f_Lg_R\)

      \(=\sum_{L \subseteq 2^U}\sum_{R \subseteq 2^U} \frac{1}{2^n} \sum_{T \subseteq 2^U}(-1)^{|T \cap L|}(-1)^{|T \cap R|}(-1)^{|T \cap S|}f_Lg_R\)

      \(=\frac{1}{2^n}\sum_{T \subseteq 2^U} (-1)^{|T \cap S |} \left[ \sum_{L \subseteq 2^U} (-1)^{|T \cap L|}f_L \right] \left[ \sum_{R \subseteq 2^U} (-1)^{|T \cap R|}g_R \right]\)

      如果我們做出如下定義

      對于集合冪級數 \(f\) 我們定義他的快速沃爾什變換為 \(\hat f\)

      \(\hat {f_S} = \sum_{T \subseteq 2^U} f_T(-1)^{|S \cap T|}\)

      那么 \(\hat{f}\)的逆變換 \(f\)

      \(f_S =\frac{1}{2^n} \sum_{T \subseteq 2^U} \hat{f_S} (-1)^{|S \cap T|}\)

      那么我們就有

      \(h_S=\frac{1}{2^n}\sum_{T \subseteq 2^U} \hat{f_T} \hat{g_T}\)

      所以就有 \(\hat{f_S}\hat{g_S}=\hat{h_S}\)

      這樣就會得到\(h_S=\frac{1}{2^n}\sum_{T \subseteq 2^U} \hat{h_S}\)

      所以現在的問題是怎么求 \(f\) 以及 \(\hat{f}\)

      同樣還是 DP

      \(f[i][x]\)表示第 \(i+1\) 到第 \(n\) 位相同,且對\((-1)\)的指數貢獻不考慮第 \(i+1\) 到第 \(n\)\((-1)^k \times a[y]\) 的和

      對于第 \(i\) 層來說

      如果第 \(i\) 位是 \(0\) , 那么 \(f[i][x]=f[i-1][x]+f[i-1][x+2^{i-1}]\)

      如果第 \(i\) 位是 \(1\) , 那么 \(f[i][x]=f[i-1][x-2^{i-1}]-f[i-1][x]\)

      對于第\(i\)層的每一段,令 \(t1=f[i-1][x],t2=f[i-1][x+2^{i-1}]\)

      那么 \(f[i][x]=t1+t2\)

      \(f[i][x+2^{i-1}]=t1-t2\)

      對于逆變換則把它倒回去就可以了

      \(f[i][x]\)表示 \(1\)\(i\)位相等,對指數貢獻為 \((i+1)\)位到\(n\)位的\((-1)^k \times a[y]\)的和

      如果第 \(i\) 位是 \(0\) , 那么 \(f[i][x]=\frac{f[i-1][x]+f[i-1][x+2^{i-1}]}{2}\)

      如果第 \(i\) 位是 \(1\) , 那么 \(f[i][x]=\frac{f[i-1][x-2^{i-1}]-f[i-1][x]}{2}\)


      代碼:

      #include<iostream>
      #include<cstdio>
      #include<cstring>
      using namespace std;
      
      const int mm=998244353;
      const int maxn=1000000;
      const int inv2=499122177;
      
      int n;
      long long A[maxn];
      long long B[maxn];
      long long C[maxn];
      
      void FMTor(long long *arr,int n,int f){
      	for(int k=1;k<n;k<<=1){
      		int p=k+k;
      		for(int i=0;i<n;i+=p){
      			for(int j=0;j<k;++j){
      				if(f==1){
      					arr[i+j+k]=(arr[i+j+k]+arr[i+j])%mm;
      				}else{
      					arr[i+j+k]=(arr[i+j+k]-arr[i+j]+mm)%mm;
      				}
      			}
      		}
      	}
      }
      void FMTand(long long *arr,int n,int f){
      	for(int k=1;k<n;k<<=1){
      		int p=k+k;
      		for(int i=0;i<n;i+=p){
      			for(int j=0;j<k;++j){
      				if(f==1){
      					arr[i+j]=(arr[i+j]+arr[i+j+k])%mm;
      				}else{
      					arr[i+j]=(arr[i+j]-arr[i+j+k]+mm)%mm;
      				}
      			}
      		}
      	}
      }
      
      void FWTxor(long long *arr,int n,int f){
      	for(int k=1;k<n;k<<=1){
      		int p=k+k;
      		for(int i=0;i<n;i+=p){
      			for(int j=0;j<k;++j){
      				long long x=arr[i+j],y=arr[i+j+k];
      				if(f==1){
      					arr[i+j]=(x+y)%mm;
      					arr[i+j+k]=(x-y+mm)%mm;
      				}else{
      					arr[i+j]=(x+y)*inv2%mm;
      					arr[i+j+k]=(x-y+mm)*inv2%mm;
      				}
      			}
      		}
      	}
      }
      
      int main(){
      	scanf("%d",&n);
      	for(int i=0;i<(1<<n);++i)scanf("%lld",&A[i]);
      	for(int i=0;i<(1<<n);++i)scanf("%lld",&B[i]);
      	
      	FMTor(A,1<<n,1);
      	FMTor(B,1<<n,1);
      	for(int i=0;i<(1<<n);++i)C[i]=A[i]*B[i]%mm;
      	FMTor(A,1<<n,-1);
      	FMTor(B,1<<n,-1);
      	FMTor(C,1<<n,-1);
      	for(int i=0;i<(1<<n);++i)printf("%lld ",C[i]);
      	printf("\n");
      	
      	FMTand(A,1<<n,1);
      	FMTand(B,1<<n,1);
      	for(int i=0;i<(1<<n);++i)C[i]=A[i]*B[i]%mm;
      	FMTand(A,1<<n,-1);
      	FMTand(B,1<<n,-1);
      	FMTand(C,1<<n,-1);
      	for(int i=0;i<(1<<n);++i)printf("%lld ",C[i]);
      	printf("\n");
      	
      	FWTxor(A,1<<n,1);
      	FWTxor(B,1<<n,1);
      	for(int i=0;i<(1<<n);++i)C[i]=A[i]*B[i]%mm;
      	FWTxor(A,1<<n,-1);
      	FWTxor(B,1<<n,-1);
      	FWTxor(C,1<<n,-1);
      	for(int i=0;i<(1<<n);++i)printf("%lld ",C[i]);
      	printf("\n");
      	return 0;
      }
      
      
      posted @ 2018-07-09 18:34  ws_zzy  閱讀(216)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 国产欧美日韩免费看AⅤ视频| 亚洲AV国产福利精品在现观看| 国产盗摄xxxx视频xxxx| 人人人澡人人肉久久精品| 亚洲AV午夜成人无码电影| 久热天堂在线视频精品伊人| 人妻偷拍一区二区三区| 亚洲国产美女精品久久久| 99久久久无码国产精品免费| 成人av天堂男人资源站| 德安县| 亚洲欧美日韩在线码| 国产精品日日摸夜夜添夜夜添无码| 亚洲 都市 无码 校园 激情| 94人妻少妇偷人精品| 国产自拍偷拍视频在线观看| 久久婷婷五月综合色和啪| 大地资源中文第二页日本| 欧美三级在线播放| 国产毛片基地| 精品国产福利久久久| 夜夜添无码一区二区三区| 国产成人精品午夜在线观看| 国产99久久亚洲综合精品西瓜tv| 少妇人妻偷人精品免费| 黑森林福利视频导航| 国产在线中文字幕精品| 亚洲欧美综合人成在线| 免费A级毛片无码A∨蜜芽试看 | 国产激情福利短视频在线| 漂亮人妻中文字幕丝袜| 精品一区二区三区在线播放视频| 国产无遮挡又黄又大又爽| 亚洲欧美综合一区二区三区| 亚洲天堂av在线免费看| 国产精品一码二码三码| 丰满爆乳一区二区三区| 亚洲码与欧洲码区别入口| 国产三级精品三级在线专区1| 久久香蕉国产线看观看猫咪av| 久久人爽人人爽人人片av|