• 【Codeforces 449D】Jzzhu and Numbers(高维前缀和)


    传送门

    先用高维前缀和求出ii的超集的个数aia_i
    然后2ai12^{a_i}-1就是&&之和为ii的超集的个数
    然后高维前缀差分就得到为ii的答案

    #include<bits/stdc++.h>
    using namespace std;
    #define cs const
    #define pb push_back
    #define re register
    #define ll long long
    #define pii pair<int,int>
    #define fi first
    #define se second
    cs int RLEN=1<<20|1;
    inline char gc(){
    	static char ibuf[RLEN],*ib,*ob;
    	(ob==ib)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
    	return (ib==ob)?EOF:*ib++;
    }
    inline int read(){
    	char ch=gc();
    	int res=0;bool f=1;
    	while(!isdigit(ch))f^=ch=='-',ch=gc();
    	while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
    	return f?res:-res;
    }
    cs int mod=1e9+7;
    template<class tp>inline void chemx(tp &a,tp b){a<b?a=b:0;}
    template<class tp>inline void chemn(tp &a,tp b){a>b?a=b:0;}
    inline void Add(int &a,int b,int mod){(a+=b)>=mod?(a-=mod):0;}
    inline void Dec(int &a,int b,int mod){a-=b,a+=a>>31&mod;}
    cs int N=(1<<20)|1;
    int n,a[N],pw[N];
    inline void fmt(int *f,int lim,int kd){
    	for(int mid=1;mid<lim;mid<<=1)
    	for(int i=0;i<lim;i+=mid<<1)
    	for(int j=0;j<mid;j++)
    	kd?Add(f[i+j],f[i+j+mid],mod-1):Dec(f[i+j],f[i+j+mid],mod);
    }
    int main(){
    	#ifdef Stargazer
    	freopen("lx.cpp","r",stdin);
    	#endif
    	n=read();pw[0]=1;
    	for(int i=1;i<N-1;i++)pw[i]=(pw[i-1]+pw[i-1])%mod;
    	for(int i=1;i<=n;i++)a[read()]++;
    	fmt(a,N-1,1);
    	for(int i=0;i<N-1;i++)a[i]=pw[a[i]];
    	fmt(a,N-1,0);
    	cout<<a[0];
    }
    
  • 相关阅读:
    软件工程概论总结第三章
    软件工程概论总结第二章
    软件工程概论总结
    软件工程概论10-软件测试
    软件工程概论9-软件实现
    软件工程概论-8面向对象设计
    软件工程概论-7面向对象分析
    软件工程概论-6面向对象基础
    软件工程概论-5软件工程中的形式化方法
    软件工程概论-4需求过程
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/12328336.html
Copyright © 2020-2023  润新知