51Nod-1434-区间LCM

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 long

using 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;
}

参考

《素数相关》

全部评论

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务