合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。
现在,请你求在一个合数的因子中,有几个因子是合数。例如,16的因子有1,2,4,8,16,其中4,8,16为合数,它有3个因子为合数。
现在,请你求范围1至n中,因子中合数个数为x的数的数量(多次询问)。
输入格式:
第一行输入两个整数 n,m(1≤n,m≤10
5
) 表示范围以及询问次数。
接下来 m 行,每行一个正整数 x(1≤x≤n),查询范围1至n中,因子中合数个数为x的数的数量
输出格式:
一个整数,即满足题意的答案。
输入样例:
在这里给出一组输入。例如:
10 5
1
2
3
4
5

思路

因为要计算1~n有多少个因子是合数,这里用i表示正在判断的数,因此我们必须要在找到一个数的因子之后,再进行判断是不是合数。显然除了1*i,所有的因子都是小于i的(在计算到i之前我们已经计算过这些数是否为合数),为了避免对这些数进行重复判断,因此用一个数组adjust来记录数字是否为合数,是的话记为1,不是则记为0。

判断一个数i是不是合数就是,除了1和本身外,还能被其他数整除,就每次从2开始尝试除这个数,在这里一旦可以除尽我们就将adjust[i]标记为1,我们用一个数组sum来存储一个数的合数因子的个数,为了省事,我们只进行到sqrt(i),因为已知J可以被i整除的话,i/j一定以可以被i整除,再通过adjust数组判断j和i/j是否为合数,是的话就sum[i]+1。当然sqrt[i]是一个例外,只用判断j就可以了。要注意一个特殊的点的是,如果这个数本身是一个合数的话,那么他本身也是一个合数因子。

现在我们已知1~n所有数字的因子中合数的个数,为了查询数量方便,避免多次重复遍历sum数组,再建立一个数组result,用result[i]来存储因子中合数个数为i的数量。最后根据输入的数据直接调取result[i]中的信息就可。

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main()
{int n, m;cin >> n >> m;vector<int> adjust(n + 1, 0);vector<int> sum(n + 1, 0);//显然1,2,3不是合数for (int i = 4; i < n+1; i++){for (int j = 2; j <= sqrt(i); j++){if (i % j == 0){adjust[i] = 1;//当J不是sqrt(i)时,要判断j和i/j.if (j != sqrt(i)){if ( adjust[j] == 1){sum[i]++;}if (adjust[i / j] == 1){sum[i]++;}}//是sqrt(i)时只用判断j,因为此时i/j=j;else{if (adjust[j] == 1){sum[i]++;}}}}if (adjust[i]==1){sum[i]++;}}//计算因子中合数为i的数量vector<int> result(n + 1,0);for (int i = 0; i <= n; i++){result[sum[i]]++;}/*for (int i = 0; i <=n; i++){cout<<i<<':'<< adjust[i]<<"间隔"<<sum[i]<<"间隔"<<result[i]<<endl;}*///打印结果int i;while (m--){cin >> i;cout << result[i]<<endl;}
}

7-5合数(20分)备忘录和计数简化查找相关推荐

  1. 1024 科学计数法 (20)(20 分)

    1024 科学计数法 (20)(20 分) 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+, ...

  2. 习题1.8 二分查找 (20 分)

    习题1.8 二分查找 (20 分) 本题要求实现二分查找算法. 函数接口定义: Position BinarySearch( List L, ElementType X ); 其中List结构定义如下 ...

  3. C++学习之路 | PTA乙级—— 1024 科学计数法 (20 分)(精简)

    1024 科学计数法 (20 分) 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][1-9].[0-9]+E[±][0-9]+,即数字的整数部分只有 1 位,小数 ...

  4. PAT 1024 科学计数法 (20分) C语言实现

    1024 科学计数法 (20分) 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][1-9].[0-9]+E[±][0-9]+,即数字的整数部分只有 1 位,小数部 ...

  5. C++学习之路 | PTA乙级—— 1014 福尔摩斯的约会 (20分)(精简)

    1014 福尔摩斯的约会 (20分) 大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hys ...

  6. 【PAT乙】1044 火星数字 (20分)

    1044 火星数字 (20分) 火星人是以 13 进制计数的: 地球人的 0 被火星人称为 tret. 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, ju ...

  7. 醉林疯的PTA 7-2 换硬币 (20分)

    7-2 换硬币 (20分) 将一笔零钱换成5分.2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法? 输入格式: 输入在一行中给出待换的零钱数额x∈(8,100). 输出格式: 要求按5分.2 ...

  8. PAT --- 1072.开学寄语 (20 分)

    1072 开学寄语 (20 分) 下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使其百无聊赖,然后,净面.理发.整衣 ...

  9. 1014 福尔摩斯的约会 (20 分)

    1014 福尔摩斯的约会 (20 分) 大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hy ...

最新文章

  1. 独家 | 手把手教你用Python创建简单的神经网络(附代码)
  2. opencv图像恢复逆滤波_OpenCV之快速的图像边缘滤波算法
  3. Python a,b = b,a 是怎么赋值的
  4. 高级会计师资格考试成绩合格证在全国范围内几年有效
  5. java+cache使用方法_java相关:springboot使用GuavaCache做简单缓存处理的方法
  6. Kaggle-自行车租赁人数预测
  7. DEA模型(数据包络分析)deap2.1操作方法
  8. autosar-Layered Software Architecture
  9. Apache ab测试解析
  10. 【清晖诗社】“立秋” 诗意浓,佳作有奖征集ing!
  11. Rational Team Concert 的使用
  12. 培养学生数学核心素养,不能制造“数学小糊涂”!
  13. java实现查询Word是否包含批注和修订内容
  14. 打印机服务器端口无显示器,什么是打印机端口?无法找到打印机端口是怎么回事?...
  15. C++ 判断路径是否存在,不存在则创建(包含多级创建)
  16. USB gadget设备驱动解析
  17. 数字图像处理——拉普拉斯算子【像素级别处理】(python)
  18. 分子动力学模拟Amber/Gromacs结合自由能计算 药效团模型构建RMSD、RMSF
  19. puppy linux 5.11中文集成清爽160m,中文Puppy Linux开发者之家
  20. 多云管理行政管理规范需求_征服多云管理的6种工具

热门文章

  1. Oracle Clob类型踩坑系列
  2. 前端小白实战过程----制作在线购物类网页
  3. android语音对讲,QQ HD(Android Pad)1.5:新增语音对讲和视频播放
  4. BOJ 480 田田背课文
  5. div添加手型和链接
  6. java题 答案是玫瑰花,《长腿的玫瑰》阅读练习及答案(2019年湖北省十堰市中考题)...
  7. xcode怎么更换app的图标和名字?
  8. IT咨询公司薪酬比较
  9. 圆梦蓝天,铸就伟业:山东飞龙海陆空集团正式启航
  10. Linux操作系统基础教程