很巧妙的DP转移方式。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+1;
int sum[MAXN];
void read(int&a){
char ch;while(!((ch=getchar())>='0')&&(ch<='9'));
a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';
}
inline void prin_d(int x)
{
if (x > 9)
{
prin_d(x / 10);
}
putchar(x % 10 + '0');
return ;
}
int main()
{
int n,i,j,mx,tmp,mxdig,x;
while(~scanf("%d",&n))
{
mx=0;
memset(sum,0,sizeof(sum));
for(i=0;i<n;i++)
{
read(x);
mx=max(mx,x);
sum[x]++;
}
tmp=mx;
mxdig=0;
while(tmp)
{
mxdig++;
tmp>>=1;
}
for(j=mxdig;j>=0;j--)
{
for(i=1;i<=mx;i++)
{
if((i>>j)&1)
sum[i-(1<<j)]+=sum[i];
}
}
sum[0]=n;
for(i=0;i<MAXN;i++)
{
prin_d(sum[i]);
puts("");
}
}
}