先附上所有因数的求法:

我的做法:是今天误打误撞写出来的;

http://exam.upc.edu.cn/problem.php?id=5062

然后,我上网找居然没有人写一个高效一点的,我这个做法其实就是.

不一定要会比根号N快,但是

模拟求所有因子个数的做法:

大家知道为什么所有因子的个数为:

设P1,P2……Pn都是数的质因子,

设C1,C2……Cn是数的质因子的个数:

Ans=(C1+1)*(C2+1)*……*(Cn+1)

大家想知道模拟一下就知道为什么了。

比如120=2*2*2*3*5;

那么Ans=(3+1)*(1+1)*(1+1)

要是求它的因子那么就是:

(1+2+4+8)*(1+3)*(1+5)

=(1+2+4+8)+(3+6+12+24)+(5+10+20+40)+(15+30+60+120)

其中所有因数为:

1 , 2 , 3 , 4 , 5 , 6 , 8 , 10 , 12  ,  15  ,  20  ,  24  ,  30  ,  40  ,  60  ,  120

因数之和就是

=(1+2+4+8)+(3+6+12+24)+(5+10+20+40)+(15+30+60+120)

大家琢磨琢磨为什么是这样。

#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
typedef long long ll;
ll qpow(ll a,ll b){ll ans=1;while(b){if(b&1){ans=ans*a;}a=a*a;b>>=1;}return ans;
}
/*(2*3*5*7*11)*(13*17*19*23*29)*(31*37*41*43*47)
=614,88978,25884,91410前15个质数相乘得到一个 6 e18的数字
*/
vector<ll>v[20];
map<ll,int>Vis;
ll a[N],cnt,Type;
void dfs(ll x,int step){if(Vis[x]==0&&step==Type){Vis[x]=1;a[cnt++]=x;return ;}for(int i=0;i<v[step].size();i++){dfs(x*v[step][i],step+1);}
}
void solve(){ll n;scanf("%lld",&n);cnt=0;for(int i=0;i<20;i++){v[i].clear();}Type=0;Vis.clear();for(ll i=2;i*i<=n;i++){if(n%i==0){int D=0;while(n%i==0){D++;n/=i;}for(int j=0;j<=D;j++){v[Type].push_back(qpow(i,j));}Type++;}}if(n!=1){v[Type].push_back(1);v[Type].push_back(n);Type++;}dfs(1,0);sort(a,a+cnt);for(int i=0;i<cnt;i++){printf("%lld%c",a[i],i==cnt-1?'\n':' ');}
}
int main()
{int T;scanf("%d",&T);while(T--){solve();}return 0;
}

归纳总结一下:质因数分解更快的做法:


1589: 题目名称:分解质因数

时间限制: 1 Sec 内存限制: 128 MB

题目描述

求出区间[a,b]中所有整数的质因数分解。

输入

输入两个整数ab

输出

每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...k也是从小到大的)(具体可看样例)

样例输入

3 10

样例输出

3=3

4=2*2

5=5

6=2*3

7=7

8=2*2*2

9=3*3

10=2*5

提示

先筛出所有素数,然后再分解。

数据规模和约定

2<=a<=b<=10000

#include<bits/stdc++.h>
using namespace std;
const int N=100;
typedef long long ll;
ll a[N],cnt;
void solve(ll n){ll tn=n;cnt=0;for(ll i=2;i*i<=n;i++){if(n%i==0){int D=0;while(n%i==0){D++;n/=i;a[cnt++]=i;}}}if(n!=1){a[cnt++]=n;}sort(a,a+cnt);printf("%lld=",tn);for(int i=0;i<cnt;i++){printf("%lld%c",a[i],i==cnt-1?'\n':'*');}
}
int main()
{ll n,m;scanf("%lld%lld",&n,&m);for(ll i=n;i<=m;i++){solve(i);}return 0;
}

求一个数的所有因数+质因数分解【数论】相关推荐

  1. 求一个数的所有因数的和

    /*     给你一个数求出这个数的所有因数的和 这题没什么特别的     知道一个公式即可     假设这个数是n,质因数分解后可以写成     n=a1^k1*a2^k2*--*ai^ki     ...

  2. 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)

    太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...

  3. c语言怎么求一个数的所有因数,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include main() { int n,q,p,m,k=1,sum=0,s[99999]={2},t[99999];//n是输入 ...

  4. [信息学奥赛一本通-T1620]质因数分解-数论

    题目描述 原题来自:NOIP 2012 普及组 已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数. 输入 输入只有一行,包含一个正整数 n. 输出 输出只有一行,包含一个正整数 p,即较大 ...

  5. 真约数求法 c语言,数学:求一个数的真约数(因数)的个数及所有约数之和

    一. 我们知道,每个自然数(不包括0和1)都有2个以上的因数,因数最少的是质数(也叫素数),质数的因数是1和它本身.非质数的自然数也叫合数,它们都含有3个以上(含3个)的因数. 1.怎样求一个数有多少 ...

  6. [质因数分解]樱花 洛谷P1445

    题目背景 又到了一年樱花盛开的时节.Vani 和妹子一起去看樱花的时候,找到了一棵大大的樱花树,上面开满了粉红色的樱花.Vani 粗略估计了一下,一共有足足 n! 片花瓣. Vani 轻柔地对她说:& ...

  7. 求一个数的所有因子(约数)

    约数是指若整数a除以整数b(b≠0)除得的商正好是整数而没有余数,比如10的约数分别为1,2,5,10,这些数都能被10整除而没有余数,所以他们都是10的约数. 下面我们来看看约数如何求解 1.传统方 ...

  8. C++判断是否为素数、求一个数的因数、质因数分解

    判断一个数是否为素数 #include<iostream> #include<vector> #include<math.h> #include<algori ...

  9. 质因数分解求给定正整数的因数个数

    正整数因数个数的快速求法 以72为例,将72进行质因数分解,72 = 2*2*2*3*3 = 2^3 * 3^2 将底数2的幂次和底数3的幂次分别加1再相乘 得到72的因数个数 = (3+1) * ( ...

最新文章

  1. 11岁少女叫板支付宝!会写代码的孩子,到底多可怕?
  2. Mysql事务和锁原理
  3. php处理二进制,PHP应用:PHP处理二进制数据的实现方法
  4. leetcode_add_two_numbers
  5. Socket 实现聊天功能
  6. 【mac开发.NET】No installed provisioning profiles match the installed iOS signing identities
  7. 【论文】本周论文推荐(11.23-11.29)
  8. 解决华硕FX80G* Fn+F5或其他功能键切换不显示问题
  9. java面向对象程序设计 第3版_Java面向对象程序设计(第3版)-聂哲
  10. NeoKylin7服务器操作系统安装
  11. Python--发送邮件和钉钉消息
  12. Golang Append()详解
  13. 亿级流量电商详情页系统设计与实战-小型电商架构VS大型电商架构
  14. Day11-软件测试设计之银行储蓄系统
  15. IT30: IT项目之20年软技能
  16. 用 Python 写个俄罗斯方块小游戏
  17. 【Codesys】字节数组转长字节,长字节转字节数组,同点位坐标系位置偏移计算
  18. 服务器操作系统巡检维护,服务器操作系统巡检内容
  19. 计算机电竞学院就业方向,电竞专业主要是学什么的 有前途吗
  20. 链表:链表分割问题:以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

热门文章

  1. winsxs探索之组件的本质:文件与注册表
  2. 数据如何变成知识,第 2 部分 数据湖和数据沼泽
  3. Python读取MEIC文件(.nc格式及.asc格式)
  4. Joel Spolsky在耶鲁大学的演讲(上)
  5. 飞象星球落地重庆云阳86所学校,县乡4万学生迎来素质课堂
  6. `Caché/IRIS` 代码优化效率提升十一条 - 持续更新
  7. 质量与效能 | 11月29日TF84
  8. 《阿里云服务器搭建》------ 安装jdk
  9. [JZOJ]2109 清兵线 题解
  10. 计算机网络基础(理论知识全)