poj 3292 Semi-prime H-numbers

本文介绍了一种计算特定范围内H-semi-prime数的方法。H-semi-prime数是指能够表示为两个H-prime数乘积的特殊整数。文章通过示例输入输出展示了算法的有效性,并给出了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意: 
一个H-number是所有的模四余一的数。(x=4*k+1) 
如果一个H-number是H-primes 当且仅当它的因数只有1和它本身(除1外)。
一个H-number是H-semi-prime当且仅当它只由两个H-primes的乘积表示。
H-number剩下其他的数均为H-composite。
给你一个数h,问1到h有多少个H-semi-prime数。

 

Sample Input

 

21 
85
789
0

 

Sample Output

 

21 0
85 5
789 62
刷水题练手
首先一个数i是H数,那么i(4x+1)也是H数,且是H合数
显然x不能为0
因为i%4=1,(4x+1)%4=1
复杂度是o(N/4*(lnN/4)/4)≈800000
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 typedef long long lol;
 8 bool b[1000002];
 9 int semi[1000002];
10 lol ans[1000002]; 
11 int main()
12 {lol i,j;
13 int x;
14   for (i=5;i<=1000001;i+=4)
15     {
16       for (j=5;j*i<=1000001;j+=4)
17     {
18       if (semi[i]==0&&semi[j]==0)
19         semi[i*j]=1;
20       else semi[i*j]=-1;
21     }
22     } 
23   for (i=1;i<=1000001;i++)
24     if (semi[i]==1)
25     ans[i]=ans[i-1]+semi[i];
26     else ans[i]=ans[i-1];
27   while (cin>>x && x)
28     {
29       printf("%d %lld\n",x,ans[x]);
30     }
31 }

 


 

转载于:https://www.cnblogs.com/Y-E-T-I/p/8074011.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值