【算法详解】线性筛法 与 欧拉函数

本文详细介绍了线性筛法的概念及其优化,强调每个数只被其最小质因数筛一次。同时,解释了欧拉函数的定义、性质,并通过公式法和线性筛法展示了如何求解欧拉函数,还给出了欧拉函数的三条关键性质。
摘要由CSDN通过智能技术生成

线性筛法

what is 线性筛??就是基于最基本的筛法的优化。

在基础的筛法上,我们发现有的数字会被重复筛,例如6既会被2枚举到也会被3枚举到,必然有重复运算。

我们的做法就是让每一个数的最小因数筛。
F O R \mathrm{FOR} FOR E X A M P L E : \mathrm{EXAMPLE}: EXAMPLE

有一个数 2 ∗ 2 ∗ 3 ∗ 5 2 * 2 * 3 * 5 2235
有另一个数 3 ∗ 3 ∗ 3 ∗ 5 3 * 3 * 3* 5 3335
那么第一个数枚举到3的话,筛到的数字是 2 ∗ 2 ∗ 3 ∗ 3 ∗ 5 2 * 2 * 3 * 3 * 5 22335
但是在第二个数字再次枚举的时候 枚举到2时 也会枚举到 2 ∗ 2 ∗ 3 ∗ 3 ∗ 5 2 * 2 * 3 * 3 * 5 22335
因此,维护这个最小指引数即可。

怎么维护??
i i i m o d mod mod 这 个 质 因 数 这个质因数 = 0 =0 =0 说明是质因数,第一次枚举到就要 b r e a k break break,这样就保证了一定会被最小素因数给筛。

#include<bits/stdc++.h>
using namespace std;
int main()
{
   
	int n,cnt=0;
	int prime[10000]={
   };//用来存储素数 
	int Vis[10000]={
   };//用来判断是否是素数
	cin>>n;
	for (int i=2;i<=n;i++)
	{
   
		if (Vis[i]==0) prime[++cnt]=i;//如果没有被标记过 
		for (int j=1;j<=cnt&&i*prime[j]<=n;j++)//用i去乘上每一个已经求过的素数 
		{
   
			Vis[i*prime[j]]=1;//标记素数 
			if (i%prime[j]==0) break;//下面再解释 
		}
	}
	for (int i=2;i<=n;i++) 
	    if (Vis[i]==0) cout<<i<<' ';
	return 0; 
} 

一、欧拉函数概念

欧拉函数,是表示1~n中与n互质的元素的个数,记为 φ ( n ) φ(n) φ(n)

二、性质

  • 如果n为某一素数p,显然 φ ( p ) φ(p) φ(p)为p-1
  • 如果n为某一素数的幂次,那么: ϕ ( p a ) = ( p − 1 ) ∗ p a − 1 \phi(p^a)=(p-1)*p^ {a-1} ϕ(pa)=(p1)pa1
    我们可以来推导次函数的求法
    我们先将n分解质因数得:
    n = a 1 b 1 ∗ a 2 b 2 ∗ a 3 b 3 ∗ … … ∗ a k b k n=a1^{b1}*a2^{b2}*a3^{b3}*……*ak^{bk} n=a1b1a2
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值