zoukankan      html  css  js  c++  java
  • 【CF449D】Jzzhu and Numbers

    题目

    提供一个非容斥做法——(FWT)

    我们发现我们要求的东西就是一个背包,只不过是在(and)意义下的

    自然有

    [dp_{i,j}=sum_{k&a_i=j}dp_{i-1,k}+dp_{i-1,j} ]

    我们发现这个柿子本质上就是一个和卷积

    于是两边取(fwt),我们就可以得到一个暴力(fwt)的代码

    for(re int i=1;i<=n;i++) {
        	memset(A,0,sizeof(A));
        	A[a[i]]=1;Fwtand(A,1);
        	for(re int j=0;j<len;j++) S[j]=S[j]+S[j]*A[j];
    }
    Fwtand(S,-1);
    

    我们发现其实(fwt)的正向变换求得是超集和,又因为我们这里只有一个(A[a[i]]=1),所以所有(A_j)最多就是(1)(A_j=1)的时候会使得(S_j)翻倍,所以整体下来我们只需要关心(S_j)翻了多少倍

    显然有多个(a_i)(j)的超集就能翻多少倍,于是我们对(A)整体来一个(fwt)就好了

    但是非常蛇皮的一点就是当(a)全是(0)的时候会把空集算入答案,因此需要特判一下

    代码

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define re register
    #define LL long long
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    const int maxn=2500005;
    const int mod=1e9+7;
    inline int read() {
        char c=getchar();int x=0;while(c<'0'||x>'9') c=getchar();
        while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
    }
    int len,n,M;
    LL S[maxn],A[maxn],a[maxn],pw[maxn];
    inline void Fwt(LL *f,int o,int mod) {
        for(re int i=2;i<=len;i<<=1)
            for(re int ln=i>>1,l=0;l<len;l+=i)
                for(re int x=l;x<l+ln;++x)
                    f[x]+=o*f[ln+x],f[x]=(f[x]+mod)%mod;
    }
    int main() {
        n=read();
        for(re int i=1;i<=n;i++) a[i]=read(),M=max(M,a[i]);
        len=1;while(len<=M) len<<=1;
        pw[0]=1;
        for(re int i=1;i<=n;i++) pw[i]=(pw[i-1]+pw[i-1])%mod;
        for(re int i=1;i<=n;i++) A[a[i]]++;
        Fwt(A,1,mod-1);
        for(re int i=0;i<len;i++) A[i]=pw[A[i]];
        Fwt(A,-1,mod);
        if(A[0]==pw[n]) std::cout<<A[0]-1;
        else std::cout<<A[0];
        return 0;
    }
    
  • 相关阅读:
    构造函数以及四种方法的调用
    函数声明与函数表达式的区别
    display:inline-block,block,inline的区别与用法
    SASS 使用(vs code)
    SASS 使用(安装)
    vue 学习笔记1 入门
    ES6学习5 字符串的扩展
    ES6学习4 变量的解构赋值
    es6 学习2 模板字符
    es6 学习1 let表示变量 、const表示常量 与 var 变量的区别
  • 原文地址:https://www.cnblogs.com/asuldb/p/10687979.html
Copyright © 2011-2022 走看看