1441 士兵的数字游戏
2015-10-21 11:20
274 查看
51nod网站链接:士兵的数字游戏
看懂题目后就知道,其实这道题就是求区间[1,a]内的所有数的质因子个数之和。
方法利用线性筛素数的方法,可以以O(n)的复杂度求出所有素数。
同时对程序稍作变动,就可以在求素数的同时求质因子个数,并累加
看懂题目后就知道,其实这道题就是求区间[1,a]内的所有数的质因子个数之和。
方法利用线性筛素数的方法,可以以O(n)的复杂度求出所有素数。
同时对程序稍作变动,就可以在求素数的同时求质因子个数,并累加
#include<stdio.h> //using namespace std; const int MaxPrimNum = 183072, MaxSize = 5000001; //, MaxSize1 = 31251 int MinPrime[MaxSize]; //分别记录可以整除MaxSize的最小与最大prime的index //MaxPrime可以改成bit类型数组来记录是否是prime或者是否是Prime幂次方 int prime[MaxPrimNum],result[MaxSize]; int j, len, num_prime = 1, T, tmpresult; __int64 i, tmp, tmp1; int tmpsumresult = 0; int main() { // result[1] = 0; // tmp1 = (MaxSize >> 1) + 1; for (i = 2; i < MaxSize/*tmp1*/; ++i) { if (MinPrime[i]) { len = MinPrime[i]; tmpresult = result[i] + 1; tmpsumresult = result[i] += tmpsumresult; } else { prime[len = MinPrime[i] = num_prime++] = i; tmpresult = 2; result[i] = ++tmpsumresult; } for (j = 1; j <= len && (tmp = i * prime[j]) < MaxSize; ++j) { MinPrime[tmp] = j; result[tmp] = tmpresult; } } scanf("%d", &T); for (i = 0; i < T; ++i) { scanf("%d%d", &tmp, &tmp1); printf("%d\n", result[tmp]-result[tmp1]); } return 0; }
相关文章推荐
- coolWeather (三)
- Block - 5
- java 环境搭建
- 接口应用——策略模式
- 3.2、BI之SSIS之简单ETL包开发
- Tomcat源码分析——请求原理分析(中)
- 参数关键点和return返回多个(伪多个)值问题
- Vim提示E325(锁机制)
- 如何对待Release与Debug运行结果不一致
- 从一个xib文件中加载另一个xib文件
- Ubuntu系统下bash和dash的区别(修改默认sh为bash)
- lwip协议栈里面回调函数的使用
- 3.1、BI之SSIS之基础包的创建
- 文章标题 关于MySQL卸载几点注意事项
- IOS根据路径读取文件大小
- 关于事务的简单理解
- mavlink解析
- matlab 计算大型距离方阵,distance matrix
- [Yii] Yii::log()和Yii::trace(),日志的使用
- eclipse部署maven web项目到tomcat服务器时,没有将lib、web.xml复制过去的解决办法