博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3292(筛法+打表)
阅读量:7121 次
发布时间:2019-06-28

本文共 1103 字,大约阅读时间需要 3 分钟。

题目链接:https://vjudge.net/problem/POJ-3292

题意:定义4n+1数(简称H数),H数分为三类:unit,即为1; H-primes,只能分解为1×自身,类似于我们平时说的素数; H-composites,除unit和H-primes数以外的H数。输入h,求[1,h]之间的H-composites数的个数。

思路:写了我3个多小时,因为题目理解错误和代码错误,写得崩溃。。QAQ。先说我想到的正确解法,注意到H-primes和我们说的素数基本类似,所以我们可以用欧筛法打表求出所有的H-primes,然后打表求出所有的H-composites,方法是枚举所有素数,如果这两个素数的乘积小于1e6+1,则记录为H-composites,要注意的是这里的判断不能写prime1[i]*prime[j]<=1000001,因为prime1[i]*prime[j]可能超出int范围,然后会导致段错误,所以应该除法判断(见代码)。然后对每一组输入h,二分查找<=h的最大H-composites数,它的下标+1即有多少个<=h的H-composites数,即所求结果。

AC代码:

#include
#include
#include
using namespace std;const int maxn=1000005;int h,vis[maxn],prime1[maxn],cnt1,prime2[maxn],cnt2;void Prime(){ memset(vis,1,sizeof(vis)); for(int i=5;i<=1000001;i+=4){ if(vis[i]) prime1[cnt1++]=i; for(int j=0;j
<=1000001;++j){ vis[i*prime1[j]]=0; if(i%prime1[j]==0) break; } } memset(vis,0,sizeof(vis)); for(int i=0;i
>1; if(x>=prime2[m]&&x

 

转载于:https://www.cnblogs.com/FrankChen831X/p/10699960.html

你可能感兴趣的文章
Linux Watchdog Test Program
查看>>
Linux命令之reset - 终端屏幕混乱的终结者
查看>>
Java多线程3:Thread中的静态方法
查看>>
从SQL Server数据库转到Oracle数据库的数据脚本处理
查看>>
使用Javap
查看>>
jquery 使用方法
查看>>
栈的增长方向(ZZ)
查看>>
end_request: I/O error
查看>>
C# 串口操作系列(4) -- 协议篇,文本协议数据解析 .
查看>>
rman备份恢复总结
查看>>
PHP环境下配置WebGrind——让你的网站性能看得见
查看>>
使用代码更新 UIVersion 属性
查看>>
谁扰乱了中国的工资秩序?
查看>>
两种Freemarker模板路径设置方法
查看>>
PS网页设计教程V——如何在Photoshop中创建一个商业网站布局
查看>>
【css】谈谈 css 的各种居中——读编写高质量代码有感
查看>>
mssql 事务的一个例子
查看>>
用DataAdapter对象填充DataSet数据集。
查看>>
Quartz任务调度器
查看>>
6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念
查看>>