【51Nod1406】与查询

来源:互联网 发布:淘宝查排名 编辑:程序博客网 时间:2024/06/01 23:07

有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<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<set>#include<ctime>#include<vector>#include<cmath>#include<algorithm>#include<map>#define mod 1000000007 #define ll long long  #define inf 1e9using namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    int a1=0,a[20];    a[1]=0;    if (!x) a1++;    while (x)    {        a[++a1]=x%10;x/=10;    }    for (int i=a1;i>=1;i--)        putchar(a[i]+'0');}int n,dp[1000005];int main(){    n=read();    for (int i=1;i<=n;i++)    {        int x=read();        dp[x]++;    }    for (int j=20;j>=0;j--)        for (int i=1e6;i>=0;i--)            if (i&(1<<j)) dp[i^(1<<j)]+=dp[i];    for (int i=0;i<=1e6;i++)        write(dp[i]),puts("");    return 0;}
原创粉丝点击