Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
xor_convolution.hpp
[詳解]
1#include "../../kyopro_library/template.hpp"
2
3/// @brief 高速アダマール変換
4template<typename T>
5void FHT(vector<T>& a, bool inv=false) {
6 int h=__lg(a.size());
7 for(int i=0; i<h; i++) for(int j=0; j<1<<h; j++) if(~j>>i&1) {
8 T x=a[j],y=a[j|1<<i];
9 a[j]=x+y,a[j|1<<i]=x-y;
10 if(inv) a[j]/=2,a[j|1<<i]/=2;
11 }
12 return;
13}
14
15/// @brief XOR Convolution
16/// @brief C[k] = Σ(i^j = k) A[i]B[j] なる C を返す
17/// @note O(n log(n))
18template<typename T>
19vector<T> XorConvolution(vector<T> a, vector<T> b) {
20 FHT(a); FHT(b);
21 for(int i=0; i<a.size(); i++) a[i]*=b[i];
22 FHT(a,true);
23 return a;
24}
void FHT(vector< T > &a, bool inv=false)
高速アダマール変換
vector< T > XorConvolution(vector< T > a, vector< T > b)
XOR Convolution