YBTOJ祭—质数与约数

目录
image
线性筛素数
欧拉筛,老生常谈
个人感觉放这道题的代码不如放板子:

Click
//欧拉筛
int prime[maxn];
int factor[maxn];
int Prime(int n)
{   
    int p=0;
    for(int i=2;i<=n;i++)
    {
        if(!factor[i])
        {
            prime[p++]=i;
            factor[i]=i;            
        }
        for(int j=0;j<p&&prime[j]*i<=n;j++)
        {
            factor[prime[j]*i]=prime[j];
            if(!(i%prime[j])) 
                break;      
        }   
    }
    return p;   
}
 

质数距离
题干看似很水,但是深藏不漏,其实也很简单
其实本来不必处理所有的质数
我们只需要将R开根号后的数内的质数求出来然后再进行一遍埃式筛,就可以得到答案了!

Click
#include<bits/stdc++.h>

using namespace std;

#define int long long

//sqrt(2^31 - 1)
const int N = 1e6 + 10;
int primes[N], cnt;
bool st[N];

void init(int n) 
{
    memset(st, 0, sizeof st);
    cnt = 0;
    for (int i = 2; i <= n; ++i) 
    {
        if (!st[i]) primes[cnt ++ ] = i;
        for (int j = 0; primes[j] * i <= n; ++j) 
        {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}

signed main() 
{
    int l, r;
    while (cin>>l>>r) 
    {
        init(50000);

        //把[l,r]区间内所有的合数用他们的最小质因子筛掉
        memset(st, 0, sizeof st);
        for (int i = 0; i < cnt; ++i) 
        {
            int p = primes[i];
            for (int j = max(2 * p, (int)ceil((double)l / p) * p); j <= r; j += p)//这里第一种方法:c++内置函数
                st[j - l] = true;//st内我们取偏移量,直接写的话数字太大
        }

        //剩下的所有的都是素数了
        cnt = 0;
        for (int i = 0; i <= r - l; ++i)
            if (!st[i] && i + l > 1)//1不是质数,不可以加进来!要特判一下
                primes[cnt ++ ] = i + l;//质数是i + l

        if (cnt < 2) printf("There are no adjacent primes.\n");
        else 
        {
            //计算间隔
            //下面代码真正体现了“相邻”的指导思想
            int minp = 0, maxp = 0;
            for (int i = 0; i < cnt - 1; ++i) 
            {
                int d = primes[i + 1] - primes[i];
                if (d < primes[minp + 1] - primes[minp]) minp = i;
                if (d > primes[maxp + 1] - primes[maxp]) maxp = i;
            }
            printf("%lld,%lld are closest, %lld,%lld are most distant.\n", 
            primes[minp], primes[minp + 1], 
            primes[maxp], primes[maxp + 1]);
        }
    }
    return 0;
}


不定方程

posted @ 2024-03-19 23:06  Merlin·Lee  阅读(5)  评论(0编辑  收藏  举报