NUIST OJ 1369 [2017 江苏科技大学 程序设计竞赛] B. Mr.Z 的四因子数 (数据加强版)
来源:互联网 发布:铣床和车床编程区别 编辑:程序博客网 时间:2024/09/21 08:53
NUIST OJ 1369 [2017 江苏科技大学 程序设计竞赛] B. Mr.Z 的四因子数 (数据加强版)
- NUIST OJ 1369 2017 江苏科技大学 程序设计竞赛 B MrZ 的四因子数 数据加强版
- 题目
- 题目分析
- 求素数表及欧拉函数表
- 根据分解关系求数量
- 一个素数的三次方的情况
- 两个不相等的素数的乘积
- 整体代码与运行结果
- 随便说说
- 后记
题目
题目描述
Mr.Z 是一多高超的数学大师,最喜欢研究的领域是数论,由于要经常做各类特殊的整数分布研充,所以他想麻烦你帮他解决一个问题。
考虑这样的一个数 K,它只含有四个因子,比如 10,它只有:1、2、5、10 这四个因子。我们将满足上述性质的数称为四因子数。
现在想请问你在区间 [ a, b ] 内有多少个四因子数。
输入描述
有多组测试数据,每组测试数据占一行。
每一行中,有两个用空格分隔的正整数 a 和 b。
a 和 b 均不超过 700000。
输出描述
对每组测试数据,输出一行答案。
样例输入
1 66666
1 666666
样例输出
15878
142481
题目分析
易得,四因子数可以为两个不相等的素数的乘积或者一个素数的三次方。
因此,题目就划归成为求素数表和根据分解关系求数量
求素数表及欧拉函数表
此处贴出我之前写的快速求素数表的方法
快速求素数表——埃氏筛法与欧拉筛法
详细就不再解释了
根据分解关系求数量
一个素数的三次方的情况
此处需要用到头文件
#include<cmath>
这是为了使用下面的cbrt()函数
cbrt()函数的作用是开三次方。在欧拉函数中,可以直接求得在 1-T 的数字中,由一个素数的三次方组成四因子数的个数。
sum = pri[(int)cbrt(T)];
两个不相等的素数的乘积
两个不相等素数的乘积即使素数表中第1个开始,乘以第2个、第3个直到乘积即将大于 T 为止
结束本次循环之后,从第2个素数开始重复执行上述循环,直到素数的大小即将大于 T 的二次开方。
for (int i = 0, m, n, t = sqrt(T);; i++) { m = pri[prime[i]]; n = pri[T / prime[i]]; if (prime[i]>t) break; else sum += n - m;}
整体代码与运行结果
/*code is far away from bug with the animal protecting* ┏┓ ┏┓*┏ ┛┻━━━┛┻┓*┃ ┃ *┃ ━ ┃*┃ ┳┛ ┗┳ ┃*┃ ┃*┃ ┻ ┃*┃ ┃*┗━┓ ┏━┛* ┃ ┃神兽保佑* ┃ ┃代码无BUG!* ┃ ┗━━━┓* ┃ ┣┓* ┃ ┏┛* ┗┓┓┏━┳┓┏┛* ┃┫┫ ┃┫┫* ┗┻┛ ┗┻┛* */#include<iostream>#include<cstring>#include<cmath>using namespace std;#define LENGTH 701005int is_prime[LENGTH];//是否是素数 int prime[LENGTH];//素数表 int pri[LENGTH];//欧拉函数表 int get(int T) { int sum; sum = pri[(int)cbrt(T)]; for (int i = 0, m, n, t = sqrt(T);; i++) { m = pri[prime[i]]; n = pri[T / prime[i]]; if (prime[i]>t) break; else sum += n - m; } return sum;}int main() { int a, b; memset(is_prime, 0, sizeof(int)*LENGTH); memset(prime, 0, sizeof(int)*LENGTH); memset(pri, 0, sizeof(int)*LENGTH); for (int i = 2, t = 0, p = 0; i < LENGTH/2; i++) { pri[i] = pri[i - 1]; if (is_prime[i] == 0) { prime[p++] = i; pri[i]++; } for (int j = 0; j<p&&i*prime[j] <= LENGTH/2; j++) { is_prime[i*prime[j]] = 1; if (i%prime[j] == 0) break; } } while (cin >> a >> b) { cout << get(b) - get(a - 1) << endl; } return 0;}
似乎神兽在MarkDown里面出了点问题大家不要在意这个细节
结果如下
随便说说
在查询量很大的时候,这题目还可以用差分进行优化,以此达到高效多组查询的目的。
然而偷懒的我就不写在这里。
后记
照例感谢 ThinkSpirit诸位大佬的支持
附上大佬的题解
- NUIST OJ 1369 [2017 江苏科技大学 程序设计竞赛] B. Mr.Z 的四因子数 (数据加强版)
- NUIST OJ 1364 [2017 江苏科技大学 程序设计竞赛]D.重复成绩统计(改编) 【STL-map】
- 1362: B. Mr.Z 的四因子数 (改编)
- [2016 NUIST 程序设计竞赛] B. 欧几里得的公约数
- [2016 NUIST 程序设计竞赛] A. 莱布尼兹的最值
- [2016 NUIST 程序设计竞赛] D. 达朗贝尔的台阶
- 西南科技大学第九届程序设计竞赛B题解题报告(线段树版)
- 2017山东省大学生程序设计竞赛(青岛科技大学)引发的感想
- 第十六周oj项目四——求出一个数的奇数因子
- 第十二届北京师范大学程序设计竞赛 B 数细菌
- 挑战程序设计竞赛——1.63抽签加强版
- 湖南科技大学OJ Ignatius and the Princess I 加强
- swust OJ 2360 Change(加强数据版)
- 江苏科技大学“FlySpiders”小组会议
- Luogu P2240 数的计数数据加强版
- OJ双人赛:程序设计竞赛的新尝试
- 【华为oj】求一个数的指数因子
- 人见人爱A^B 数据加强版
- C语言指针入门(三)
- JSP自定义标签实现数据字典
- Oracle入门基础
- unity console加强版
- Shell(六)
- NUIST OJ 1369 [2017 江苏科技大学 程序设计竞赛] B. Mr.Z 的四因子数 (数据加强版)
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍
- Redis设计与实现——数据结构与对象
- hdu5441
- c++primer 第五版课后习题 第五章
- 1129. Recommendation System (25)
- Sql Server的存储过程与Java代码相连接调用(二)
- [LCA] POJ 1330
- JavaScript 面向对象之继承