记$cnt(x)$为$x$在二进制下1的个数,构造$A_{i}=4^{cnt(i)}a_{i},B_{j}=4^{cnt(j)}b_{j}$,将两者FWT得到$C_{k}=\sum_{i|j=k}A_{i}B_{j}$
注意到$i\&j=0\iff cnt(i)+cnt(j)\le cnt(k)$(实际上是相等,但如果不等仅会更大),答案即$\lfloor\frac{C_{k}}{4^{cnt(k)}}\rfloor \&3$
另外,注意到FWT过程中值会达到$\left(3\sum_{i=0}^{n}{n\choose i}4^{i}\right)^{2}=9\times 5^{2n}$,注意到自然溢出并不影响,使用unsigned long long存储即可
时间复杂度为$o(n2^{n})$,可以通过
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N (1<<21)+1 4 #define ull unsigned long long 5 int n,cnt[N]; 6 ull a[N],b[N],c[N]; 7 char sa[N],sb[N],sc[N]; 8 void FWT(ull *a,int p=1){ 9 for(int i=0;i<n;i++) 10 for(int j=0;j<(1<<n);j++) 11 if (j&(1<<i))a[j]+=a[j^(1<<i)]*p; 12 } 13 int main(){ 14 scanf("%d%s%s",&n,sa,sb); 15 for(int i=0;i<(1<<n);i++)cnt[i]=cnt[i>>1]+((i&1)<<1); 16 for(int i=0;i<(1<<n);i++){ 17 a[i]=sa[i]-'0',b[i]=sb[i]-'0'; 18 a[i]<<=cnt[i],b[i]<<=cnt[i]; 19 } 20 FWT(a),FWT(b); 21 for(int i=0;i<(1<<n);i++)c[i]=a[i]*b[i]; 22 FWT(c,-1); 23 for(int i=0;i<(1<<n);i++)sc[i]=((c[i]>>cnt[i])&3)+'0'; 24 printf("%s\n",sc); 25 return 0; 26 }