题意:给定一个数组,求[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 ;
}

最新文章

  1. redis总结
  2. [Perl]抓取个人的所有闪存+格式化保存为文本
  3. iOSQuartz2D-03-定制个性头像
  4. 20145208 《Java程序设计》第9周学习总结
  5. linux 如何让程序在开机时启动,关机前关闭
  6. U8记账凭证修改方法汇总
  7. cas sso单点登录系列7_ 单点登录cas常见问题系列汇总
  8. 【转】在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持--不错
  9. js---DOM元素节点
  10. JavaScript细节成败
  11. python向ftp上传文件,解决中文问题
  12. scala下划线
  13. 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框
  14. html5-label标签
  15. Ubuntu下删除卸载程序图标
  16. mssql借助链接服务器进行数据快速迁移
  17. 广播中receiver配置需要注意data的配置
  18. Wpf 导出CSV文件
  19. eclip 重写从父类继承的方法的快捷操作
  20. 关于使用JQ scrollTop方法进行滚动定位

热门文章

  1. java语言编程使用正则表达式来实现提取(美团 3-5年经验 15-30k 北京 hadoop高级工程)中的3-5和15-30
  2. STM32F407使用MFRC522射频卡调试及程序移植成功
  3. 负载均衡服务器中存在大量的TIME_WAIT怎么解决
  4. pat1004. Counting Leaves (30)
  5. windows下openssl config failed
  6. 调用sqlserver中的存储过程
  7. sqlite3在别的目录写文件的问题
  8. SGI STL红黑树中迭代器的边界值分析
  9. 前端(三大框架、Bootstrap,jQuery,自整理)
  10. Kafka监控利器