CF449D Jzzhu and Numbers题解

CF449D Jzzhu and Numbers

题目描述

Jzzhu 有 nnn 个非负整数 a1,a2,⋯ ,ana_{1},a_{2},\cdots,a_{n}a1,a2,,an。我们将一组下标序列 i1,i2,⋯ ,iki_{1},i_{2},\cdots,i_{k}i1,i2,,ik1≤i1<i2<⋯<ik≤n1 \le i_{1}<i_{2}< \cdots <i_{k} \le n1i1<i2<<ikn)称为大小为 kkk 的一组“组”。

Jzzhu 想知道,有多少组满足 ai1&⁡ai2&⁡⋯&⁡aik=0a_{i_1} \operatorname{\&} a_{i_2} \operatorname{\&} \cdots \operatorname{\&} a_{i_k}=0ai1&ai2&&aik=01≤k≤n1 \le k \le n1kn)?请帮他计算,并输出满足条件的组数对 100000000710000000071000000007109+710^{9}+7109+7)取模后的结果。操作 x&⁡yx \operatorname{\&} yx&y 表示两个数的按位与运算。

输入格式

第一行包含一个整数 nnn1≤n≤1061\le n\le 10^{6}1n106)。
第二行包含 nnn 个整数 a1,a2,⋯ ,ana_{1},a_{2},\cdots,a_{n}a1,a2,,an0≤ai≤1060\le a_{i}\le 10^{6}0ai106)。

输出格式

输出一个整数,表示满足条件的组数对 100000000710000000071000000007 取模后的结果。

输入输出样例 #1

输入 #1

3
2 3 3

输出 #1

0

输入输出样例 #2

输入 #2

4
0 1 2 3

输出 #2

10

输入输出样例 #3

输入 #3

6
5 2 0 5 2 1

输出 #3

53

说明/提示

由 ChatGPT 5 翻译

思路

高位前缀和即可。

代码见下


```#include<bits/stdc++.h> 
using namespace std;
long long n,a[1000006],f[5000006],p2[1000006],om;
const long long mod=1e9+7;
long long pow2(long long a1,long long b1){
    long long c1=1;
    while(b1!=0){
        if(b1%2==1){
            c1=c1*a1%mod;
        }
        a1=a1*a1%mod;
        b1/=2;
    }
    return c1;
}
int main(){
    cin>>n;
    om=pow(2,22)-1;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        f[a[i]]++;
    }
    p2[0]=1;
    for(int i=1;i<=22;i++){
        p2[i]=p2[i-1]*2;        
    }
    for(int i=0;i<=21;i++){
        for(int j=0;j<=om;j++){
            if((j&p2[i])==0){
                f[j]=(f[j]+f[j|p2[i]])%mod;
            }
        }
    }
    for(int i=0;i<=om;i++){
        f[i]=pow2(2,f[i]);
    }
    for(int i=0;i<=21;i++){
        for(int j=0;j<=om;j++){
            if((j&p2[i])==0){
                f[j]=(f[j]-f[j|p2[i]]+mod)%mod;
            }
        }
    }    
    cout<<f[0]<<endl;
	return 0; 	
}
posted @ 2026-02-06 17:10  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源