质数与合数

质数与合数

https://ac.nowcoder.com/acm/problem/21350

一个模拟题,得在自己清醒的时候打...不然就会乱坟岗..
思路很简单,就是找到两个质数是不是差>(k+1),因为我们都足够聪明.那么,你下次肯定会取1(假设我是FFF),而我取k都到不了,那么我必输.其它肯定是我必胜,因为1,2,3你都不能取.所以这题就没了.但是,细节是真的多...具体看代码吧...码风还行..

#include <bits/stdc++.h>
using namespace std;
const int N=1e7+5;

int prime[N],cnt=0;
bool st[N];

void init()
{
    for(int i=2;i<=N-5;i++)
    {
        if(!st[i]) {prime[cnt++]=i;}
        for(int j=0;prime[j]<=(N-5)/i;j++)
        {
            st[i*prime[j]]=true;
            if(i%prime[j]==0)
            {
                break;
            }
        }
    }
}

int main()
{
    init();
    bool flag=true;
    int n,k,pos,m=0;
    scanf("%d%d",&n,&k);
    if(n<=2) {puts("0");return 0;}
    for(int i=1;prime[i]<=n;i++)
    {
        m++;
        if(prime[i]-prime[i-1]>k+1)
        {
            flag=false;
        }
    }
   // cout<<prime[m]<<endl;
    if(n-prime[m]>k) {puts("0");return 0;}
    if(flag)//FFF可以赢
    {
       // puts("9");
        //FFF可以赢,那么每次选k的时候会尽量多选些质数.
        int wz,ans=0;
        while(1)
        {
            wz=n-k;
            int xb=lower_bound(prime,prime+m,wz)-prime;
            ans++;
            if(prime[xb]<=3) break;
            n=prime[xb]-1;
            ans++;
        }
        printf("%d\n",ans);
    }
    else//GGG可以赢
    {
       // cout<<prime[pos]<<endl;
        int wz,ans=0;int cnt=m;
        if(n==prime[m])
        {
            if(n-k<=prime[m-1]) cnt--;
            else                {puts("0");return 0;}
        }
        while(1)
        {
            if(n-k<=prime[cnt])
            {
                n=prime[cnt];
            }
            else break;
            ans++;
            int xb=upper_bound(prime,prime+m,n-k)-prime;
            n=prime[xb]-1;
            cnt=xb-1;
            ans++;
        }
        if(ans) printf("%d\n",-ans);
        else    puts("0");
    }
    return 0;
}
lpt的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论
5 1 是不是应该输出0
1 回复 分享
发布于 2020-11-09 20:05

相关推荐

06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
强大的马里奥:不太可能,我校计算机硕士就业率99%
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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