51Nod-1434-区间LCM
来源:互联网 发布:ipad如何下载软件 编辑:程序博客网 时间:2024/06/02 00:04
ACM模版
描述
题解
这里我们可以肯定的是M一定不大于2 * N
,这里我们只需要考虑所有质因子最高阶对应的数字即可,求得这些数字中最大的,结果一定是这个数的二倍(这里的二倍和前边的2 * N
道理是一样的)。为啥只用考虑最高阶呢?因为低阶的一定都能够由多个数字提供因子组成,所以可以不用考虑(One)。
不管用什么办法实现,貌似都需要线性筛,筛选出小于N的所有素数,不同的就是ans
的求法,花样很多,但是都是和最高阶有关(Two)。
代码
One:
#include <stdio.h>#define MAXN 1000009#define MAXP 300000#define max(a, b) ((a) > (b) ? (a) : (b))int prime[MAXN];int p[MAXP];int main(){ int k = 0; for (int i = 2; i < MAXN; i++) { if (!prime[i]) { p[k++] = i; for (int j = 2 * i; j < MAXN; j += i) { prime[j] = 1; } } } int T; scanf("%d", &T); while (T--) { int N, g = 1; scanf("%d", &N); for (int i = 0; p[i] <= N; i++) { for (int j = p[i]; j <= N; j *= p[i]) { g = max(g, j); } } printf("%d\n", g * 2); } return 0;}
Two:
#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define rep(i, s, t) for (int i = s; i <= t; i++)#define dwn(i, s, t) for (int i = s; i >= t; i--)#define clr(x, c) memset(x, c, sizeof(x))#define ll long longusing namespace std;const int MAXN = 1e6 + 5;int prime[MAXN << 3];bool vis[MAXN + 1];int main(){ int cnt = 0, tp; rep(i, 2, MAXN) { if (!vis[i]) { prime[++cnt] = i; } rep(j, 1, cnt) { tp = prime[j]; if ((ll)tp * i > MAXN) { break; } vis[tp * i] = 1; if (i % tp == 0) { break; } } } int T, u, v; scanf("%d", &T); while (T--) { int n; scanf("%d", &n); int ans = n; if (n == 1) { printf("2\n"); continue; } rep(i, 1, cnt) { if (prime[i] > n) { break; } tp = 1; u = (int)(log(n) / log(prime[i])); v = (int)pow(prime[i], u); for (int j = 2; ; ++j) { if (v * j > n) { v *= j; break; } } ans = max(ans, v); } printf("%d\n", ans); } return 0;}
参考
《素数相关》
0 0
- 51Nod-1434-区间LCM
- 51nod 1434 区间LCM
- 51nod-1434 区间LCM
- 51nod 1434 区间LCM
- 51NOD 1434 区间LCM
- 51nod-1434 区间LCM
- 51nod 1434 区间LCM
- 51nod 1434 数论区间LCM问题
- 51nod 1434 区间LCM【数论】
- 51NOD 1434 区间LCM(素数筛)
- 51Nod-1012-最小公倍数LCM
- 1434 区间LCM
- 1434 区间LCM
- 51Nod-1672-区间交
- 【 51NOD 1434 素数筛 】【数论+思维+筛素数】区间LCM【找到一个最小整数M,满足M>N,LCM(N+1,N+2,..,M-1,M)是LCM(1,2,3,4,.,N-1,N) 的倍数】
- 51nod 1012 最小公倍数LCM
- 51 NOD 1012 最小公倍数LCM
- 【51Nod】1012 最小公倍数LCM
- CI框架中load库上传xls,xlsx和zip无法识别的解决方法
- UE4中HTC Vive 手柄如何抓取物体
- Java中Scanner的nextInt(),next(),nextLine()方法总结
- 安卓7.0新特点
- C语言二位数组
- 51Nod-1434-区间LCM
- ubuntu16.04与win10双系统的安装过程遇到的问题解决方案记录
- 配置Log4j(很详细)
- LeetCode 100. Same Tree
- 2. Add Two Numbers--2016/09/18
- Leetcode No. 136. Single Number
- LeetCode No.53 Maximum Subarray
- Linux下 C++程序的编写
- linux的一些学习笔记