参天大树 题解

题目id:5602

题目描述

丛林中矗立着一棵参天大树,高度为\(y\)
大树\(2\sim p\)高度处,每个位置都有一只蚱蜢。
一只蚱蜢如果在\(x\)高度处,那么它可以跳到\(2x、3x、4x、......\)等任意一个\(x\)的倍数处。
你想在\(2\sim y\)高度范围内,找到一个尽可能高且不会有任何蚂蚱能跳到的位置。
注意你和蚂蚱的位置都必须是整数,如果你找不到任何一个合法的位置的话,就输出\(-1\)

解题思路

别看这题目数据很大,实际上就是个纸老虎。
因为题目要尽可能高,所以我们从\(y\sim p\)倒着枚举,如果某个数满足条件就输出,然后调用exit(0)函数终止程序。
那我们如何判断该数是不是满足呢\(?\)
枚举该数的因子,设某因子为\(i\),如果\(i \leq p\)则该数不是一个可行解。
(就这么简单)(坏笑hiehiehie)
然鹅,当你兴冲冲写了这样的代码提交上去时,却发现只有\(\textcolor[RGB]{14,144,210}{TLE} 30pt(s)\)

#include<bits/stdc++.h>
#define Ios ios::sync_with_stdio(0),cin.tie(nullptr),cout.tie(nullptr)
#define ll long long
using namespace std;
ll p,y,l,r;
bool check(ll mid)
{
    for(ll i=2;i<=mid;++i)if(mid%i==0&&i<=p)return 0;
    return 1;
}
int main()
{
    Ios,cin>>p>>y;
    for(ll i=y;i>p;--i)if(check(i))cout<<i,exit(0);
    cout<<-1;
    return 0;
}

那是因为这题还要"亿"点优化,我们可以只枚举到\(\sqrt{mid}\)就可以找遍\(mid\)所有的因子,加上后即可\(\textcolor[RGB]{82,196,26}{AC}\)这道题.

AC Code

#include<bits/stdc++.h>
#define Ios ios::sync_with_stdio(0),cin.tie(nullptr),cout.tie(nullptr)
#define ll long long
using namespace std;
ll p,y,l,r;
bool check(ll mid)
{
    for(ll i=2;i<=mid;++i)if(mid%i==0&&i<=p)return 0;
    return 1;
}
int main()
{
    Ios,cin>>p>>y;
    for(ll i=y;i>p;--i)if(check(i))cout<<i,exit(0);
    cout<<-1;
    return 0;
}
posted @ 2024-07-26 15:46  Firra3500  阅读(7)  评论(0编辑  收藏  举报