UPC:2536 Changlong(二进制技巧)

来源:互联网 发布:梦幻西游手游脚本源码 编辑:程序博客网 时间:2024/06/02 13:39

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;}


 

0 0