素数筛选
题目连接:http://poj.org/problem?id=3292
题意:4n+1称为H数,如果一个H数的约数中不存在H数(1除外),那么他就是H素数,否则就是H合数;如果一个H数是两个H数的乘积,那么它就是H合成数。求n以内有多少H合成数。
思路:首先把几何内所有的数(4n+1)定位0,表示它为H素数,然后两个H素数的乘积标记为1,表示H合成数。如果不是两个H素数的乘积,那么就标记为-1,表示H合数。最后统计一遍得到结果。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int Max = 1000050; int H_semi_prime[Max]; void solve(){ int i,j; memset(H_semi_prime,0,sizeof(H_semi_prime)); for(i = 5 ; i <=Max;i+=4) { for(j = 5 ; j <=Max ; j +=4) { int temp = i * j; if(temp>Max) break; if(H_semi_prime[i]==0&&H_semi_prime[j]==0) //H_prime H_semi_prime[temp]= 1; //H_semi_primes else H_semi_prime[temp] = -1; // H_composite } } int ant = 0; for(i = 1 ; i <=Max;i++) { if(H_semi_prime[i]==1) ant++; H_semi_prime[i] = ant; } } int main(){ solve(); int l; while(scanf("%d",&l),l) printf("%d %d\n",l,H_semi_prime[l]); return 0; }

浙公网安备 33010602011771号