彩排
这道题是卡内存的,极小的内存让你根本无法开一个稍微大一点的数组把数都存起来
那么解决办法就是每输入一个数就把这个数处理了,提炼出有用的信息对于这个题目
正确的做法是这样
这个题,统计每个学校的人数,输出不能被K整除的那个,简单说 统计数字出现次数,输出不能被K整除的数字。用二进制统计一下。将每个数转化为二进制,用一个数组统计二进制每位1出现的次数,按位统计1的个数。我们可以假设,刚好能够被K整除 ,则每一个二进制位的 1 的个数都能够被K整除,若加上一个任意的数字则,则它会使得他二进制位1所在的不能够被K整除。所以只需要转化为二进制统计每个位置上1出现的次数,再对K取模
下面上代码:
注意 long long 刚开始我用的int ,因为这些数很容易就爆int了,处在int的最边缘,所以最好还是要用long long
#include<stdio.h>
#include<string.h>
long long num[35];
void get_it(long long m)//将数拆分为二进制然后存入数组中
{
int i=1;
while(m>0)
{
num[i++]+=m%2;
m/=2;
}
}
int main()
{
long long n,k;
while(~scanf("%lld%lld",&n,&k))
{
memset(num,0,sizeof(num));
long long m,ans,t=n;
while(t--)//将数一一接收,然后拆分
{
scanf("%lld",&m);
get_it(m);
}
long long y=n%k;
ans=0;
long long x=1;
for(int i=1; i<33; i++)//把数先取余然后再加
{
ans+=x*(num[i]%k);
x*=2;
}
if(y==0)
printf("0\n");
else
printf("%lld\n",ans/y);
}
return 0;
}