线性筛1
筛法
线性筛素数
保证每次只被自己最小的质因数筛到。。
void yych()
{
for(int i = 2; i <= maxn; i ++)
{
if(!vis[i]) prime[++tot] = i;
for(int j = 1; j <= tot&&i * prime[j] <= maxn; j ++)
{
vis[i * prime[j]] = 1;
if(i%prime[j] == 0) break;
}
}
筛phi
欧拉函数 为小于i 的正整数中与互质的数的个数, 然后有公式
然后考虑怎么筛, 还是分三种情况
1.是质数 则显然
2. 能整除质数, 则说明 中含有 这个质数, 则后面的质数不会改变,只是在本身上乘上;
So,
3. 不能整除质数, 说明中不含这个因数, 也就是原来多乘了 , 化简得;
So, ;
void yych()
{
phi[1] = 1;
for(int i = 2; i <= maxn; i ++)
{
if(!vis[i])
{
prime[++tot] = i;
phi[i] = (i-1);
}
for(int j = 1; j <= tot&&prime[j]*i <= maxn; j ++)
{
vis[i * prime[j]] = 1;
if(i%prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
筛mu
可以放心,和反演无关
根据莫比乌斯函数定义来筛:
根据唯一分解定理
对于一个数,
1.则对于一个质数, 显然
,
2.若能整除, 则中 的原来指数至少为1, 中指数就一定大于1
3.若不能整除, 则中原来没有 这个质数, 相当于多了一个质数, 则, 奇变偶, 偶变奇。。。。
void yych()
{
mu[1] = 1;
for(int i = 2; i <= maxn; i ++)
{
if(!vis[i])
{
prime[++tot] = i;
mu[i] = -1;
}
for(int j = 1; j <= tot&&prime[j]*i <= maxn; j ++)
{
vis[i * prime[j]] = 1;
if(i%prime[j] == 0)
{
mu[i * prime[j]] = 0;
break;
}
else
mu[i * prime[j]] = -mu[i];
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具