求约数个数最多问题
2013-01-07 13:46
232 查看
求1 - n当中约数个数最多的数,若有多解则输出最小的数。
一般解法:从1到n枚举 根据 约数个数定理 公式求出约数个数
这需要先求出1到n的所有质数
以此来对第i个数分解质因数 质因数变化即 乘以 (上一个质因数个数+1)
对于n非常大时候效率很低
从图中可以看出 约数最多的数a
1. a中较小的质因数个数必定大于等于大一级的质因数个数
2. 随着a的递增 质因数的"种类"也按照质数的出现顺序递增
质数数组为prim(n) 则有
约数最多的数a = prim(0) ^ x0 + prim(1) ^ x1 + ...... + prim(n - 1) ^ x(n - 1)
a 的约数个数 = (x0 + 1) * (x1 + 1) * (x2 + 1) * ...... * (x(n - 1) + 1)
x0 >= x1 >= x2 >= x3 >= ...... >= x(n - 1)
#include <iostream> using namespace std; long nb; int mc; int p[] = {2,3,5,7,11,13,17,19}; //d 素数深度 c素数次方限制 tot约数个数 num当前数 up上限值 void ss(int d, int c, int tot, long long num, long up) { if((tot > mc) || ((tot == mc) && (num < nb))) {mc = tot; nb = num;} if(d > 7) return; long j = p[d], m = 1; long long n = num * j; while(m <= c && n <= up) { ss(d + 1, m, tot * (m + 1), n, up); n *= j; m++; } } int main() { int t; long n; cin>>t; while(t--) { cin >> n; mc = nb = 1; ss(0, 27, 1, 1, n); cout << nb << " " << mc << endl; } }
相关文章推荐
- 最多约数问题
- 【最多约数问题】
- 最多约数问题
- 最多约数问题
- 最多约数问题答案解析与勘误
- 最多约数问题
- 算法设计:最多约数问题
- python应用之_最多约数问题
- 最多约数问题
- 算法作业-统计数字问题&字典序问题&最多约数问题
- 最多约数问题(暴力)
- 最多约数问题
- 最多约数问题
- 最多约数问题
- NOJ1203 最多约数问题
- 最多约数问题
- 南邮 OJ 1203 最多约数问题
- 问题八十六:最多约数
- 最多约数问题
- 最多约数问题。正整数 x 的约数是能整除x的正整数,其约数的个数记为div(x),例如div(10)=4。设 a 和 b 是两个正整数,找出 a 和 b 之间约数个数最多的数 x 的约数个数。 样例