有n个整数。输出他之中和x相与之后结果为x的有多少个。x从0到1,000,000
Input
第一行输入一个整数n。(1<=n<=1,000,000). 第二行有n个整数a[0],a[1],a[2],...a[n-1],以空格分开.(0<=a[i]<=1,000,000)
Output
对于每一组数据,输出1000001行,第i行对应和i相与结果是i的有多少个数字。
Input示例
3 2 3 3
Output示例
3 2 3 2 0 0 …… 后面还有很多0
#include <stdio.h>
#define maxn 1000005
using namespace std;
typedef long long ll;
int dp[maxn];
int get_int(){
int m = 0;
char ch = getchar();
while(ch >= '0' && ch <= '9'){
m = m * 10 + ch - '0';
ch = getchar();
}
return m;
}
int main(){
int n, a;
scanf("%d", &n);
getchar();
for(int i = 0; i < n; i++){
a = get_int();
dp[a]++;
}
for(int i = 0; i <= 20; i++)
for(int j = 1; j <= 1000000; j++){
if(j&(1<<i)){
dp[j-(1<<i)] += dp[j];
}
}
dp[0] = n;
for(int i = 0; i <= 1000000; i++)
printf("%d\n", dp[i]);
return 0;
}