AOJ-AHU-OJ-7 Redraiment猜想(优化)
来源:互联网 发布:京东金融 知乎 编辑:程序博客网 时间:2024/05/29 18:52
回想起来当时请教出了“野筛法”800ms+飘过这道题的时候,内心愧疚不已。后来的后来,我问到了更强的方法,线性筛选。复杂度O(n),当然了,容斥原理是最快的,但是我死活理解不了啊……
所谓线性筛选,就是我的条件很苛刻,对于每个合数,我只允许它被最小的素因子筛选。只筛一次,那就是线性啦!
if(i % prime[j] == 0) break;枚举当前数,倘若它没有合数标记,送入素数表当中。之后开始用素数表筛它的倍数。一直筛到最小素因子(除得尽)为止。
vis[i * prime[j]] = 1;模板如下:
const int MAXN = 10000001;bool vis[MAXN];int prime[700000];void shai(){ int cnt = 0; for(int i = 2; i < MAXN; i++) { if(!vis[i]) prime[cnt++] = i; for(int j = 0; j < cnt && prime[j]*i < MAXN; j++) { vis[prime[j]*i] = 1; if(i % prime[j] == 0) break; } }}
代码如下:
#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#define MAXN 10000001bool vis[MAXN];int prime[664580];void shai(){ int c = 0; for(int i = 2; i < MAXN; i++) { if(!vis[i]) { prime[c++] = i; } for(int j = 0; j < c && prime[j]*i < MAXN;j++) { vis[prime[j]*i] = 1; if(i % prime[j] == 0) break; } }}int main(){ int n; shai(); vis[1] = 1; while(scanf("%d", &n), n){ int s = 0; for(int i = 1; i <= n; i++) if(!vis[i]) s++; printf("%d\n",s); } return 0;}
0 0
- AOJ-AHU-OJ-7 Redraiment猜想(优化)
- AOJ-AHU-OJ-7 Redraiment猜想
- aoj 7 Redraiment猜想
- AOJ-AHU-OJ-3 Redraiment的遭遇
- AOJ-AHU-OJ-153 Redraiment的走法
- AOJ 7.Redraiment猜想
- AOJ-AHU-OJ-517 序列(贪心)
- OJ-1007 Redraiment猜想
- AOJ-AHU-OJ-2 Homework
- AOJ-AHU-OJ-9 University
- AOJ-AHU-OJ-11 Rails
- AOJ-AHU-OJ-542 Window
- AOJ-AHU-OJ-489 夺宝奇兵
- AOJ-AHU-OJ-676 投票
- AOJ-AHU-OJ-531 IPv4
- AOJ-AHU-OJ-61 Lake Counting(递归)
- AOJ-AHU-OJ-61 Lake Counting(栈)
- AOJ-AHU-OJ-460 Prime Ring Problem(栈)
- CROOS COMPILING NODE FOR ARM
- win7下如何将*.sql文件导入mysql中
- C/C++语言深入学习篇
- 【转】Linux 链接脚本详解
- ubuntu12.04.4安装Sublime Text 2并注册破解
- AOJ-AHU-OJ-7 Redraiment猜想(优化)
- J2EE面试题集锦(附答案)
- LVS三种模式:lvs-nat,lvs-dr,lvs-lun简介
- C#获取当前路径的方法集合
- Java---SSH(MVC)面试题
- Read note of HDFS User Guide
- 第三周作业 冒泡排序和归并排序
- 花血本,不代表着花钱,谈谈我玩信用卡的那些事儿
- JAVA程序员面试宝典