http://acm.upc.edu.cn/problem.php?id=2536
题意:给你一个数组,有一个数出现q次,其余数字出现p次。现在要找出这个出现一次的数来。
内存卡的很紧,只要1MB。
思路:开一个数表示二进制的每一位,10^7开个25的数组足够。把每个数用二进制数表示,每位有数字则该数组位置+1。
由于有个数字不是出现了p次,所以该数字的每一位都不能被p整除。这样可以计算出这个数字来。
不能加过多头文件,它们也是会占内存的,否则会MLE。
#include <cstdio>
#include <cstring>
using namespace std;
int bnt[32]= {0};
int main()
{
int T,kase=0;
scanf("%d",&T);
while(T--)
{
printf("Case %d:\n",++kase);
int n,p,q;
scanf("%d%d%d",&n,&p,&q);
memset(bnt,0,sizeof(bnt));
for(int i=0; i<n; ++i)
{
int v;
scanf("%d",&v);
for(int j=0; j<25; ++j)
{
if(v&(1<<j))
bnt[j]++;
}
}
int ans=0;
for(int i=0; i<25; ++i)
if(bnt[i]%p) ans+=(1<<i);
printf("%d\n",ans);
}
return 0;
}