• [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
  • 相关阅读:
    jdk1.7下载
    Java导入导出Excel工具类ExcelUtil
    对接支付宝沙箱测试代码参数设置
    对接支付宝遇到的坑sign check fail: check Sign and Data Fail
    eclipse 如何配置activity(无网络状态下)
    Redis的总结
    java实现给pdf文件加水印!
    java中位移算法!
    spring整合springmvc案例
    读书笔记
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/15923694.html
Copyright © 2020-2023  润新知