YBTOJ祭—质数与约数
目录
线性筛素数
欧拉筛,老生常谈
个人感觉放这道题的代码不如放板子:
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;
}
不定方程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】