首页 > 其他分享 >牛客小白月赛99 D题 又是一年毕业季

牛客小白月赛99 D题 又是一年毕业季

时间:2024-09-11 17:20:08浏览次数:3  
标签:prime int 合数 cin 99 牛客 素数 小白月赛 整除

 题目链接:牛客小白月赛99_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ

通过对题目分析我们可以知道,题目要求我们找到一个时间t,时间t不能被a[i]整除。也就是说,t的因子不能是a[i]。由此我们可以想到,什么数比较容易满足这个条件呢?诶!就是素数(只能被1和它本身整除的数)。但是怎么证明时间t一定是素数呢?

首先我们假设时间t是一个合数,且这个合数不能被a[i]整除。因为t是合数,所以它一定存在一个除了1和它本身以外的因子,假设这个因子是x,那么x也一定满足不能被a[i]整除这一条件。既然x也满足这一条件,并且题目要求我们找的是最小的满足不能被a[i]整除的数,而x<t,那么答案肯定不是t。所以可以证明我们要求的时间t一定不是合数。

不是合数那就是素数了(t不可能为0)。有什么方法可以帮我们找到不被a[i]整除的最小的素数呢?我们自然会想到素数筛算法。

由于n<=2e5,所以我们可以用一个数组prime存储2e5+1个素数。并且我们可以使用map给所有的a[i]打上标记,最后只需要遍历2e5+1个素数,如果prime[i]满足不被a[i]整除的条件,也就是mp[prime[i]]=0,那么prime[i]就是答案。

AC code:

#include<bits/stdc++.h>
using namespace std;
#define int long long 
int t;
bool vis[1000000005];
int prime[200005];//存储2e5个素数

void pri(int n) {//欧拉筛
    int sum = 0;
    for (int i = 2; i <= n; i++) {
        if (!vis[i]) prime[++sum] = i;
        if (sum > 2e5) break;//因为n<=2e5,所以最多存储2e5+1个素数就够了
        for (int j = 1; j <= sum && i * prime[j] <= n; j++) {
            vis[i * prime[j]] = 1;
            if (i % prime[j]==0) break;
        }
    }
}

signed main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    cin >> t;

    pri(100000000);

    while (t--) {
        map<int, int>mp;

        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) {
            int a;
            cin >> a;
            mp[a] = 1;//因为a[i]有可能是素数,所以把这个素数打上标记
        }

        for (int i = 1; i <= 200001; i++) {
            if (!mp[prime[i]]) {//如果这个素数不能a[i]整除,那么直接输出
                cout << prime[i] << '\n';
                break;
            }
        }
    }

    return 0;
}

标签:prime,int,合数,cin,99,牛客,素数,小白月赛,整除
From: https://blog.csdn.net/2301_79772108/article/details/142144957

相关文章

  • 牛客 空心正方形,X形图案(c)
     空心正方形题目KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的“空心”正方形图案。示例输入:4输出:************题目链接空心正方形图案_牛客题霸_牛客网思路我们只需要将第一行和最后一行,第一列和最后......
  • 每日OJ_牛客_单词倒排(字符串模拟)
    目录牛客_单词倒排(字符串模拟)解析代码牛客_单词倒排(字符串模拟)单词倒排__牛客网时间限制:C/C++1秒,其他语言2秒空间限制:C/C++32M,其他语言64M题目描述:对字符串中的所有单词进行倒排。说明:1、构成单词的字符只有26个大写或小写英文字母;2、非构成单词的字符均视为单词......
  • 牛客小白月赛100
    A-ACM中的A题#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64usingvi=vector<int>;constintN=10;chars[N];i32main(){inta,b,c;cin>>a>>b>>......
  • 【洛谷 P1996】约瑟夫问题 题解(数组+模拟+循环)
    约瑟夫问题题目描述个人围成一圈,从第一个人开始报数,数到的人出列,再由下一个人重新从开始报数,数到的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰名小朋友,而该题是全部出圈。输入......
  • 牛客周赛 Round 59(下)
    逆序数题目描述登录—专业IT笔试面试备考平台_牛客网运行代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){lln,k;cin>>n>>k;llsum=(n*(n-1))/2;cout<<sum-k<<endl;return0;}代码思路组合数的计算:在......
  • AtCoder Beginner Contest 199 (Sponsored by Panasonic) A~E 题解
    A-SquareInequality题目大意给定三个整数\(A,B,C\)。判断\(A^2+B^2<C^2\)是否成立。\(0\leA,B,C\le1000\)输入格式\(A~B~C\)输出格式如果\(A^2+B^2<C^2\),输出Yes;否则,输出No。样例\(A\)\(B\)\(C\)输出\(2\)\(2\)\(4\)Yes\(10\)\(10\)\(10\)N......
  • 【洛谷 P1996】约瑟夫问题 题解(队列+模拟+循环)
    约瑟夫问题题目描述个人围成一圈,从第一个人开始报数,数到的人出列,再由下一个人重新从开始报数,数到的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰名小朋友,而该题是全部出圈。输入......
  • 每日OJ_牛客_骆驼命名法(递归深搜)
    目录牛客_骆驼命名法(简单模拟)解析代码牛客_骆驼命名法(简单模拟)骆驼命名法__牛客网解析代码首先一个字符一个字符的读取内容:遇到_就直接跳过。如果上一个字符是_则下一个字符转大写字母。#include<iostream>#include<string>usingnamespacestd;intmai......
  • 牛客网测试题 把十六进制数字转换为十进制数字
    1/**2*把十六进制数字转换为十进制数字3*@paramhexSrcStr4*@return5*1706*/7publicstaticStringconvertHex2Decimal(StringhexSrcStr){8if(hexSrcStr==null||hexSrcStr.trim().length()==0){9returnnull;10}11......
  • CF1991F Triangle Formation 题解
    Description你有\(n\)根棍子,从\(1\)到\(n\)编号。第\(i\)根棍子的长度是\(a_i\)。你需要回答\(q\)个问题。在每个查询中,你会得到两个整数\(l\)和\(r\)(\(1\lel<r\len,r−l+1\ge6\))。确定是否可以从编号为\(l\)到\(r\)的棒中选择\(6\)个不同的棒,形......