POJ-3292-Semi-prime H-numbers -数学

来源:互联网 发布:约瑟夫环 递归算法 编辑:程序博客网 时间:2024/06/04 00:43

大致题意:

一个H-number是所有的模四余一的数。

如果一个H-number是H-primes 当且仅当它的因数只有1和它本身(除1外)。

一个H-number是H-semi-prime当且仅当它只由两个H-primes的乘积表示。

H-number剩下其他的数均为H-composite。

给你一个数h,问1到h有多少个H-semi-prime数。

思路:

 

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>#include<algorithm>using namespace std;int flag[1000100];int ans[1000100];int N = 1e6+10;void get(){   memset(flag,0,sizeof(flag));   memset(ans,0,sizeof(ans));   int i, j;   int tmp;   for(i = 5; i <= 200010;i+=4)   {       for(j = 5; j*i < N; j+=4)       {           tmp = j*i;           if(flag[i]==0&&flag[j]==0)           {               if(tmp%4==1)///确保是H数                 flag[tmp] = 1;           }           else            flag[tmp] = -1;       }   }   int ant = 0;   for(i = 1; i < N; i++)   {       if(flag[i]==1)        ant++;       ans[i] = ant;   }}int main(){    int n;    get();    while(~scanf("%d",&n)&&n)    {        printf("%d %d\n",n,ans[n]);    }    return 0;}


0 0