Codeforces 385C 线性筛素数
2024-09-04 00:29:29
题意:给定一个数组,求[l,r] 区间,区间里的素数,数组中,能被这个素数整除的个数,再求和。
分析:区间很大,10^9了,找去区间内的素数是不可能的,但是,数组的数很小,而且要能整除区间内的素数,所以,这些很大的素数是没用的,筛出10^7以内的素数就ok了。
怎么算个数呢?
质因数分解,hash一下,再二分区间,应该是很麻烦了,但是网上还有麻烦的,还用到了线段树维护。
简单方式是:
将数组hash,在筛素数的时候,检测hash值,是否有这些数,有的话,记录到这个素数中,也就是说,这个数组中,能被这个素数整除的有s个,然后对s求一个前缀和,问题就转换为一个区间和。
#include <bits/stdc++.h> using namespace std; //10^7以内的素数
const int maxn = +; int vis[maxn],g[maxn],s[maxn]; int m;
int main(int argc, char const *argv[])
{
memset(vis,,sizeof(vis));
memset(g,,sizeof(g));
memset(vis,,sizeof(vis));
int n;
scanf("%d",&n);
for(int i=;i<n;i++) {
int x;
scanf("%d",&x);
g[x]++;
} for(int i=;i<maxn;i++) {
if(vis[i]) continue;
for(int j=i;j<maxn;j+=i) {
if(g[j])
s[i] +=g[j];
vis[j] = ;
}
} for(int i=;i<maxn;i++)
s[i] +=s[i-]; int a,b;
scanf("%d",&m);
for(int i=;i<m;i++) {
scanf("%d%d",&a,&b);
if(a>=maxn) a = maxn-;
if(b>=maxn) b = maxn-;
printf("%d\n",s[b]-s[a-]);
}
return ;
}
最新文章
- redis总结
- [Perl]抓取个人的所有闪存+格式化保存为文本
- iOSQuartz2D-03-定制个性头像
- 20145208 《Java程序设计》第9周学习总结
- linux 如何让程序在开机时启动,关机前关闭
- U8记账凭证修改方法汇总
- cas sso单点登录系列7_ 单点登录cas常见问题系列汇总
- 【转】在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持--不错
- js---DOM元素节点
- JavaScript细节成败
- python向ftp上传文件,解决中文问题
- scala下划线
- 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框
- html5-label标签
- Ubuntu下删除卸载程序图标
- mssql借助链接服务器进行数据快速迁移
- 广播中receiver配置需要注意data的配置
- Wpf 导出CSV文件
- eclip 重写从父类继承的方法的快捷操作
- 关于使用JQ scrollTop方法进行滚动定位
热门文章
- java语言编程使用正则表达式来实现提取(美团 3-5年经验 15-30k 北京 hadoop高级工程)中的3-5和15-30
- STM32F407使用MFRC522射频卡调试及程序移植成功
- 负载均衡服务器中存在大量的TIME_WAIT怎么解决
- pat1004. Counting Leaves (30)
- windows下openssl config failed
- 调用sqlserver中的存储过程
- sqlite3在别的目录写文件的问题
- SGI STL红黑树中迭代器的边界值分析
- 前端(三大框架、Bootstrap,jQuery,自整理)
- Kafka监控利器