[cf1034E]Little C Loves 3 III

记$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 }
View Code

 

posted @ 2022-02-22 16:19  PYWBKTDA  阅读(39)  评论(0编辑  收藏  举报