线性筛+区间枚举
来源:互联网 发布:南通java培训机构 编辑:程序博客网 时间:2024/06/11 09:49
题目大意:给出区间a,b求区间内素数的个数
但是a,b非常大
#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef long long LL;const int N = 1e6 + 5;bool vis[N], visab[N];int prime[N], cnt = 0;void is_prime(){memset(vis, 0, sizeof(vis));vis[1] = 1;for (int i = 2; i<N; i++){if (!vis[i]){prime[cnt++] = i;}for (int j = 0; j < cnt; j++) {if (i*prime[j] > N)break;vis[i*prime[j]] = 1;if (i%prime[j] == 0)break;//如果i能被已有的素数整数则跳出,避免重复标记}}}int main(){//freopen("Text.txt", "r", stdin);int t;cin >> t;is_prime();for (int kase = 1; kase <= t; kase++){LL a, b;scanf("%lld%lld", &a, &b);int count = 0;if (b <= N - 1){for (LL i = a; i <= b; i++){if (!vis[i])count++;}}else{memset(visab, 0, sizeof(visab));for (int i = 0; i<cnt&&prime[i] <= b; i++){LL k = a / prime[i];if (k*prime[i]<a)k++;//求第一个使k*prime[i]>=a的倍数kfor (LL j = k*prime[i]; j <= b; j += prime[i]){visab[j - a] = 1;//区间左移a}}for (LL i = a; i <= b; i++){if (!visab[i - a])count++;}}printf("Case %d: %d\n", kase, count);}}
阅读全文
0 0
- 线性筛+区间枚举
- 大数区间筛素数 线性
- Help Hanzo (素数筛+区间枚举)
- POJ-2479 Maximum sum (线性dp 维护区间最大值 枚举)
- 分配线性地址区间
- 释放线性地址区间
- Building Blocks 区间枚举
- 尺取法 枚举区间
- HDU 5583 枚举。。。区间
- HDU 6069 Counting Divisors(枚举区间)(素数筛模版)
- poj2262 Goldbach's Conjecture(线性素数筛+暴力枚举)
- 区间顺序枚举 hdu5696 区间的价值
- 线性求区间欧拉函数(顺便线性求区间内所有素数)(类似欧拉线性素数筛)
- 13 分配线性地址区间
- 14 释放线性地址区间
- 区间DP-石子合并(线性)
- 算法 线性排序-区间法
- HDU-1006 平面几何+区间枚举
- 详解linux下编译安装配置php5.6.30过程
- Linux学习笔记01:文件管理
- 慕课网学习Java入门第二季笔记
- 二叉树的基本操作 C++
- E
- 线性筛+区间枚举
- Linux常用命令
- csdn如何转载别人的文章
- larave5.4自定义公共函数的创建
- Android 各种自定义进度条Progressbar
- 4129: Haruna’s Breakfast
- shutdown、halt、poweroff、reboot的区别
- 什么是微服务?
- mysql之编码(转载)