Tongji Online Judge
Problem 1010: 数素数
#include<stdio.h>
#define set0(m, n) ((m)&~(1<<(7-n)))
typedef unsigned char Byte;
Byte count(Byte num)
{
Byte t=0;
while(num!=0) {
t+=num%2;
num/=2;
}
return t;
}
int main()
{
Byte p, a[62500], b[256];
unsigned long M, N, i, j, s, sum;
a[0]=127;
for(i=1; i<62500; i++) a[i]=255;
for(i=3; i<=1000000; i+=2)
for(j=3; j<=1000000/i; j+=2) {
s=(i*j-1)/2;
a[s/8]=set0(a[s/8], s%8);
}
for(i=0; i<256; i++) b[i]=count(i);
while(scanf("%lu%lu", &M, &N)!=EOF) {
sum=(M<=2)?1:0;
if(M%2==0) M=M+1; M=M/2;
if(N%2==0) N=N-1; N=N/2;
p=a[M/8];
p=p<<(M%8);
sum+=b[p];
for(i=M/8+1; i<N/8; i++) sum+=b[a[i]];
p=a[N/8];
p=p>>(7-N%8);
sum+=b[p];
if(M/8==N/8) sum-=b[a[M/8]];
printf("%ld/n", sum);
}
return 0;
}