起源

我在做某题时,想到一个问题,在\(1\)到\(100000\)中,哪个数拥有最多的因子?
在uoj的群问了一下,感谢vfleaking给了我一个完美答案。

传送门

前一千个反素数
一道求反素数的题,让我来贴个代码,不过写得有点丑,用的是这位大牛的搜索+剪枝方法Orz。

为了防止百度空间挂掉,这里简单复述一下:

令\(p_i\)为第\(i\)个素数,比如\(p_1=2,p_2=3,p_3=5\)。
令\(q_i\)为第\(i\)个素数的指数。

因子个数为\((q_1+1)(q_2+1)(q_3+1) ...\)。

剪枝一

\[q_1 \geq q_2 \geq q_3 \geq ...\]
证明:
假如有\(q_i < q_{i+1}\),那么令\(q_i\)加一,\(q_{i+1}\)减一,答案更优。

剪枝二

对于\(q_i(i>1)\),令\(K\)为使\(2^K>p_i\)的最小整数。
有$2^{q_1}{p_i}^{q_i} > 2^{q_1 + K - 1} {p_i}^{q_i-1} \(, 如果\)q_i\(比\)q_i-1\(优,那么\)(q_1+1)(q_i+1)>(q_1+K)q_i\(, 即\)q_i < \frac {q_1+1} {K-1}\(。这样我们就找到了\)q_i$的上界。

剪枝三

对于\(q_i(i>1)\),令\(K\)为使\(2^K>p_i\)的最小整数。
有$2^{q_1} {p_i}^{q_i} > 2^{q_1 - K}{p_i}^{q_i+1} \(, 如果\)q_i\(比\)q_i+1\(优,那么\)(q_1+1)(q_i+1)>(q_1-K+1)(q_i+2)\(, 即\)q_i > \frac {q_1-2K+1} {K}\(。这样我们就找到了\)q_i$的下界。

剪枝四

令\(K\)为满足\(2^K > p_m\)的最小整数,其中\(p_m\)为\(q_m\)一定为\(0\)的最小数。
有\(2^{q_1}>2^{q_1-K}p_m\),
前者必然比后者优,所以\(q_1+1>2(q_1-K+1)\),即\(q_1<2K\),这样,我们得到了\(q_1\)的上界。

打表代码:

#include <cstdio>
#include <math.h>
#include <iostream>
#include <cstring>
using namespace std;const int MAXDIGHT = 100;
#include "GNum.h" //高精度的库,这里不贴了int main() {static int fac[1000000], a[1000000];int cnt = 0;memset(fac, -1, sizeof(fac));static GNum x;x.A[0] = 1;cout << "const prime[54] = {";for (int i = 2; i <100000; i ++) {if (fac[i] == -1) {cout << i;a[cnt ++] = i;fac[i] = i;x.mul(i);if (x.len > 25) break;cout << ',';}for (int j = 0; j < cnt && a[j] <= fac[i]; j ++) {fac[i * a[j]] = a[j];}}cout << "};\n";cout << "const limitUpper[16][" << cnt << "] = {";for (int q1 = 0; q1 < 16; q1 ++) {if (q1) for (int i = 0; i < 28; i ++) cout << ' ';cout << "{";for (int i = 0; i < cnt; i ++) {int p = a[i];int k = ceil(log(p) / log(2));int ans = ceil((double) (q1 + 1) / (k -1)) ;if (i == 0) cout << 16;else {if (q1 && i) cout << ans;else cout << "0";}if (i == cnt-1) cout << "}";else cout << ',';}if (q1 == 16-1) cout << "};\n";else cout << ",\n";}cout << "const limitLower[16][" << cnt << "] = {";for (int q1 = 0; q1 < 16; q1 ++) {if (q1) for (int i = 0; i < 28; i ++) cout << ' ';cout << "{";for (int i = 0; i < cnt; i ++) {int p = a[i];int k = ceil(log(p) / log(2));int ans = ceil((double) (q1 + 1 - 2* k) / k) ;if ((q1 && i) && ans > 0) cout << ans;else cout << "0";if (i == cnt-1) cout << "}";else cout << ',';}if (q1 == 16-1) cout << "};\n";else cout << ",\n";}return 0;
}

提交代码:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;const int DIG = 10000;
const int MAXDIGHT = 29;const int prime[54] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251};
const int limitUpper[16][54] = {{16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{16,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{16,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{16,4,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{16,5,3,3,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{16,6,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{16,7,4,4,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{16,8,4,4,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},{16,9,5,5,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},{16,10,5,5,4,4,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},{16,11,6,6,4,4,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},{16,12,6,6,4,4,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},{16,13,7,7,5,5,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},{16,14,7,7,5,5,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},{16,15,8,8,5,5,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},{16,16,8,8,6,6,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}};
const int limitLower[16][54] = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,3,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,4,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,4,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,5,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,5,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,6,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,6,4,4,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};struct GNum{int A[MAXDIGHT], len;GNum() {len = 1;A[0] = 0;}void input() {static int buf[1000];len = 0;int* ch = buf; *(ch ++) = '#';do *ch = getchar(); while (*ch < '0' || *ch > '9');do *(++ ch) = getchar(); while (*ch >= '0' && *ch <= '9');ch --;int cnt = 0, num = 0, s = 1;while (*ch != '#') {num += s * (*ch - 48);cnt ++;s *= 10;if (cnt == 4) {cnt = 0;A[len ++] = num;num = 0, s = 1;}ch --;}if (cnt) A[len ++] = num;}void output() {printf("%d", A[len - 1]);for (int i = len - 2; i >= 0; i --)printf("%04d", A[i]);}void mul(const int &x) {if (x == 0) {len = 1;A[0] = 0;return;}for (int i = 0; i < len; i ++) {A[i] *= x;}for (int i = 0; i + 1 < len; i ++) {A[i + 1] += A[i] / DIG;A[i] %= DIG;}while (A[len - 1] >= DIG) {A[len] = A[len - 1] / DIG;A[len - 1] %= DIG;len ++;}}
};GNum upper;bool check(GNum &a, GNum &upper) {if (a.len != upper.len) return a.len < upper.len;for (int i = a.len - 1; i >= 0; i --) {if (a.A[i] != upper.A[i]) return a.A[i] < upper.A[i];}return true;
}long long ans;
GNum num[54], ansNum;void copyNum(GNum &des, GNum &src) {des.len = src.len;for (int i = 0; i < src.len; i ++) des.A[i] = src.A[i];
}void dfs(int depth, long long comb, int used, int p1) {GNum &x = num[depth];if (check(x, upper))if (comb > ans || (comb == ans && check(x, ansNum))) ans = comb, copyNum(ansNum, x);else;else return;GNum &y = num[depth + 1];copyNum(y, x);if (! used) return;int L = limitLower[p1][depth];int R = min(used + 1, limitUpper[p1][depth]);for (int i = 0; i < L; i ++) y.mul(prime[depth]);for (int i = L; i < R; i ++) {dfs(depth + 1, comb * (i + 1), i, p1);y.mul(prime[depth]);}
}int main() {upper.input();/*upper.output();printf("\n");*/num[1].A[0] = 1;for (int i = 0; i < 16; i ++) {dfs(1, i + 1, i, i);num[1].mul(2);}ansNum.output();printf("\n");return 0;
}

转载于:https://www.cnblogs.com/wangck/p/4298919.html

反素数(高合成数?)相关推荐

  1. BZOJ 1053 [HAOI2007]反素数ant

    53: [HAOI2007]反素数ant Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0< ...

  2. p1186反素数(模板题)

    描述 Description 如果一个自然数比所有比它小的自然数的约数个数都要多,那么我们就称这个数为一个反素数.例如,1.2.4.6.12和24都是反素数. 任务: 请写一个程序: ○ 读入一个自然 ...

  3. BZOJ 3085: 反质数加强版SAPGAP (反素数搜索)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3085 题意:求n(<=10^100)之内最大的反素数. 思路: 优化2: i ...

  4. HDU2521 反素数【因子数量+打表】

    反素数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  5. HDU 4228 Flooring Tiles 反素数的应用

    给你一个数N,找出一个最小的可以拆分成N种乘积表达形式的数x 比如N=2,6可以拆成2x3或者1x6两种,但不是最小的,最小的是4可以拆成1x4,2x2两种 首先可以肯定的是x必然有N*2或者是N*2 ...

  6. 反素数(luogu 1463)

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  7. BZOJ(8) 1053: [HAOI2007]反素数ant

    1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4118  Solved: 2453 [Submit][ ...

  8. Java黑皮书课后题第6章:**6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数。编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开

    6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数.编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开 题目 题目描述 破题 代码 题目 题目描述 ...

  9. Number With The Given Amount Of Divisors(反素数)

    Given the number n, find the smallest positive integer which has exactly n divisors. It is guarantee ...

最新文章

  1. Vaptcha验证码配置实现人机验证
  2. 用最新NLP库Flair做文本分类
  3. 9.10 css
  4. 【MATLAB】变量 ( 变量引入 | 变量类型 )
  5. CISCO NAT 配置
  6. nginx 入门配置
  7. Codeforces Round #257 (Div. 1) D. Jzzhu and Numbers 高维前缀和 + 容斥
  8. WebLogic常见问题
  9. 论文浅尝 | XQA:一个跨语言开放域问答数据集
  10. Matlab二维图导入ansys,(原创教程)利用Matlab对ANSYS数据进行后处理.pdf
  11. Netty入门系列(2) --使用Netty解决粘包和拆包问题
  12. 了解mysql的undo log
  13. 【python】字符串转换整数 (atoi) - String
  14. GIMP小波分解处理照片
  15. 免费的开源飞行规划软件Little Navmap
  16. 高中数学关于计算机的知识,高中数学必修三-算法概念基础知识解读
  17. TCP/IP详解学习笔记 这位仁兄写得太好了
  18. 如何做好笔记以及记好笔记的好处
  19. html5如何快速选择工具使用技巧,用PS快速选择工具抠图的方法
  20. 基于Pytorch的强化学习(DQN)之 Experience Replay

热门文章

  1. Python 使用Schema 实现接口或方法的JSON格式参数的高效、优雅校验
  2. 计算机页面图形颠倒,电脑屏幕倒过来了如何解决
  3. python交互式方式、代码文件方式_涨见识了,在终端执行 Python 代码的 6 种方式
  4. matlab中cuda编程中分配grid和block dimension的时候的注意事项
  5. DE29 Matrix Exponentials
  6. matlab中箭头详细设置
  7. 应用FileInputStream类,编写应用程序,从磁盘上读取一个Java程序,并将源程序代码显示在屏幕上
  8. 徐州工程学院计算机报名,2019年3月江苏徐州工程学院计算机等级考试报名时间...
  9. java mongo 日期范围_获取指定日期和它之前几天,之间的所有日期?千万不要踩了这个大坑!...
  10. python 中空NULL的表示