zoukankan      html  css  js  c++  java
  • 洛谷P2640 神秘磁石(欧拉筛法)

    题目背景

    在遥远的阿拉德大陆,有一种神秘的磁石,是由魔皇制作出来的,

    题目描述

    1.若给他一个一维坐标系,那么他的磁力一定要在素数坐标的位置上才能发挥的最大(不管位置坐标的大小,只要是素数那么磁力就一样大)

    2.若两个磁石相距为k,那么磁石间的破坏力将会达到当前磁力的峰值

    显然,两磁石间最大破坏力取决于磁力大小和磁石间距,那么请问给出长度不超过n的一维坐标系,有哪几对坐标间磁石破坏力最大。

    输入输出格式

    输入格式:

    两个正整数n,k。1<=k<=n<=10000

    输出格式:

    所有小于等于n的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出empty。

    题解

    筛出从1到n的所有素数,并存到一个数组中。同时开一个bool数组记录是否是素数。循环素数数组,判断当前项加k是否也是素数。同时要注意判断是否有符合条件的结果,若没有则输出empty

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=10002;
    bool flag[maxn];     //记录是否是素数    
    int s[maxn];         //记录所有素数
    int s2=1;            //记录素数个数
    void e(int n);       //筛法
    int main()
    {
        ios::sync_with_stdio(false);
        memset(flag,true,sizeof(flag));
        bool bo=false;
        flag[1]=false; 
        int n,k;       
        cin>>n>>k;
        e(n);
        for(int i=1;i<=s2+1;i++)
        {
            int y=s[i]+k;
            if(y>n)
                break;
            if(flag[y]==true)
            {
                cout<<s[i]<<" "<<y<<endl;
                bo=true;
            }
        }
        if(bo==false)
            cout<<"empty";        
        return 0;
    }
    void e(int n)
    {
        for(int i=2;i<=n;i++)
        {
            if(flag[i]==true)
            {
                s[s2]=i;
                s2++;    
            }
            for(int j=1;j<=s2+1;j++)
            {
                int k=s[j]*i;
                if(k>n)
                    break;
                flag[k]=false;
                if(i%s[j]==0)
                    break;
            }
        }
    }
  • 相关阅读:
    CS224n笔记2 词的向量表示:word2vec
    志在必得的。。。。失败。。。
    大二第二个学期帮学姐做的毕设
    本地系统密码破解
    ubuntu12.04装有线网卡驱动(AR8162)
    数据结构递归与非递归走迷宫
    vs6.0项目升迁到vs2012中宏映射问题
    文件太大,对于目标文件系统.文件过大 无法复制问题
    第39级台阶
    linux编程
  • 原文地址:https://www.cnblogs.com/Alarak26/p/8504201.html
Copyright © 2011-2022 走看看