博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
区间内无平方因子数
阅读量:6693 次
发布时间:2019-06-25

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

【题目描述】

给出正整数n,m,区间[n,m]内的无平方因子数有多少个?

整数p无平方因子,当且仅当不存在k>1,使p是k^2的倍数,1<=n<=m<=10^12,m-n<=10^7

【输入格式】

两个整数n,m

【输出格式】

[n,m]间的无平方因子数的个数

【样例输入】

1 5

【样例输出】

4

【提示】

在此键入。

【来源】

刘汝佳《入门经典》

 

题意 : 对于所给区间,询问没有平方因子的数有多少个?

思路分析 : 这个题的思想类似区间素数筛,首先将 2 到 sqrt(m)的素数全部找到,然后将所求区间内是素数平方倍数的数全部去掉,用一个数组去保存,很关键的一点是 区间的长度时不超过 1e7 的,因此只需要开一个这样长度的数组即可,计算的时候离散即可。

素数定理 : cnt(x) 约等于 x/(lnx) 。

代码示例 :

#define ll long longconst int maxn = 1e6+5;const int mm = 1e7+5;const int mod = 1e9+7;const double eps = 1e-9;const double pi = acos(-1.0);const int inf = 0x3f3f3f3f;ll n, m;bool pt[maxn];bool f[mm];void init(){    memset(pt, true, sizeof(pt));    for(ll i = 2; i <= sqrt(m); i++){        if(pt[i]){            for(ll j = i+i; j <= sqrt(m); j += i){                pt[j] = false;            }        }    }    //pt[1] = false;    }int main() {    freopen("non.in", "r", stdin);    freopen("non.out", "w", stdout);        cin >> n >> m;    if (n > m) swap(n, m);    init();        memset(f, true, sizeof(f));    for(ll i = 2; i <= sqrt(m); i++){        if (pt[i]){            for(ll j = i*i*((n+i*i-1)/(i*i)); j <= m; j += i*i){                f[j-n] = false; // 离散            }        }    }    int cnt = 0;    for(ll i = 0; i <= m-n; i++) if (f[i]) cnt++;    printf("%d\n", cnt);     return 0;}

 

转载于:https://www.cnblogs.com/ccut-ry/p/8868806.html

你可能感兴趣的文章
关闭windows的默认共享
查看>>
react开发环境搭建
查看>>
数据库读写分离
查看>>
社交是微信营销
查看>>
2008 R2 证书服务器应用详解
查看>>
hive 动态分区太多问题
查看>>
Windows Server 2008 RemoteApp(二)---部署激活远程桌面授权服务器
查看>>
读取日志文件开发总结
查看>>
IOS --React Native
查看>>
Linux CPU
查看>>
Linux/Centos ntp时间同步,联网情况和无网情况配置
查看>>
初级网络运维工程师比赛题目
查看>>
跨交换机实现vlan实验报告
查看>>
jquery easyui滚动条部分设置介绍
查看>>
cannot find -lxxx问题
查看>>
预防云端开源项目打包 Redis Labs再更改模块
查看>>
超惊人!去年发生的身分外泄安全事件是2017的4倍
查看>>
oracle sqlplus免安装的配置instantclient-basiclite
查看>>
Java开发GUI之选择列表
查看>>
一、分布式商城架构逻辑图
查看>>