南邮 OJ 1811 B. Lucky

B. Lucky

时间限制(普通/Java) :  20000 MS/ 30000 MS          运行内存限制 : 16384 KByte
总提交 : 262            测试通过 : 58 

比赛描述

    每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然这样,他就想找到那些不是lucky number。

输入

    多组输入数据
    第一行有n和m。n表示出现次数为n的是lucky number,m表示序列的长度。2<=n<=10,m<=3*10^6,m%n!=0。
    第二行为序列元素,每个元素都是正整数(int 型范围内)。

输出

    输出那个不是lucky number的数。题目保证非lucky number只有一个。

样例输入

2 5
1 1 2 2 3

样例输出

3

提示

 

题目来源

ACM爱好者协会




#include<stdio.h>
int main(){
	int n,m,i,t,r;
	int b[32];
	while(scanf("%d%d",&n,&m)==2){
		for(i=0;i<32;i++){
			b[i]=0;
		}
		while(m--){
			scanf("%d",&t);
			for(i=0;t;i++){
				if(t&1){
					b[i]++;
					b[i]%=n;
				}
				t>>=1;
			}
		}
		r=0;
		for(i=0;i<32;i++){
			if(b[i]){
				r+=1<<i;
			}
		}
		printf("%d\n",r);
	}
}





/*下面的代码内存超过了
#include<iostream>
#include<map>
using namespace std;

int main(){
	int n,m,i;
	map<int,int> mp;
	map<int,int>::const_iterator it;
	while(scanf("%d%d",&n,&m)==2){
		mp.clear();
		bool find = 0;
		while(m--){
			scanf("%d",&i);
			if(!find && ++mp[i]>n){
				find = 1;
			}
		}
		for(it=mp.begin();it!=mp.end();++it){
			if(it->second!=n){
				printf("%d\n",it->first);
				break;
			}
		}
	}
}*/



你可能感兴趣的:(ACM,Lucky,南邮OJ,B.)