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,⋯,ik(1≤i1<i2<⋯<ik≤n1 \le i_{1}<i_{2}< \cdots <i_{k} \le n1≤i1<i2<⋯<ik≤n)称为大小为 kkk 的一组“组”。
Jzzhu 想知道,有多少组满足 ai1&ai2&⋯&aik=0a_{i_1} \operatorname{\&} a_{i_2} \operatorname{\&} \cdots \operatorname{\&} a_{i_k}=0ai1&ai2&⋯&aik=0(1≤k≤n1 \le k \le n1≤k≤n)?请帮他计算,并输出满足条件的组数对 100000000710000000071000000007(109+710^{9}+7109+7)取模后的结果。操作 x&yx \operatorname{\&} yx&y 表示两个数的按位与运算。
输入格式
第一行包含一个整数 nnn(1≤n≤1061\le n\le 10^{6}1≤n≤106)。
第二行包含 nnn 个整数 a1,a2,⋯ ,ana_{1},a_{2},\cdots,a_{n}a1,a2,⋯,an(0≤ai≤1060\le a_{i}\le 10^{6}0≤ai≤106)。
输出格式
输出一个整数,表示满足条件的组数对 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;
}

浙公网安备 33010602011771号