51nod1406 与查询
这题卡I/O。。。dp一下。。。
#include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x,c) memset(x,c,sizeof(x)) const int BufferSize=10000000; char buffer[BufferSize],*head,*tail; inline char Getchar() { if(head==tail) { int l=fread(buffer,1,BufferSize,stdin); tail=(head=buffer)+l; } return *head++; } inline int read() { int x=0,f=1;char c=Getchar(); for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1; for(;isdigit(c);c=Getchar()) x=x*10+c-'0'; return x*f; } char sh[15]; void print(int x){ if(!x) { puts("0");return ; } int cnt=0; while(x) sh[++cnt]=x%10,x/=10; dwn(i,cnt,1) putchar(sh[i]+48); putchar('\n'); } const int nmax=1e6+5; const int inf=0x7f7f7f7f; int ans[nmax]; int main(){ int n=read(),u,mx=0; rep(i,1,n) ans[u=read()]++,mx=max(mx,u); rep(i,0,20) rep(j,1,mx) if(j&(1<<i)) ans[j-(1<<i)]+=ans[j]; ans[0]=n; rep(i,0,1000000) print(ans[i]); return 0; }
收藏
关注
有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
System Message (题目提供者)