UPC:2536 Changlong(二进制技巧)

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


 

你可能感兴趣的:(二进制,数学)