线性筛合集

迟到的线性筛合集。

1.线性筛质数。

这个不讲了大家都会。不过他是下面的基础。注意每个数都是被最小质因子筛去的。

2.线性筛逆元。

这个有两种做法。第一种是质数直接用费马小定理,然后根据逆元是完全积性函数直接乘起来。

第二种直接线性递推。设\(p = ki + b\),则有\(ki + b \equiv 0 (mod\ p),b = p\ \%\ i,k = \lfloor\frac{p}{i}\rfloor\)

\(b \equiv -ki (mod\ p)\)两边同乘\(inv_b,inv_i\),有:\(inv_i \equiv -k * inv_b (mod\ p)\)

得到:\(inv[i] = (p - \lfloor\frac{p}{i}\rfloor) * inv[p\%i]\ \%\ p\) 边界为\(inv[0] = inv[1] = 1\),线性递推即可。

3.线性求欧拉函数。

欧拉函数是积性函数,不是完全积性函数。

对于质数,\(\varphi(x) = x - 1\).

对于合数,如果对于现在被筛去的数,当前最小质因子是一个新的质因子,那么\(\varphi(i * p[j]) = \varphi(i) * \varphi(p[j])\)

否则\(\varphi(i * p[j]) = \varphi(i) * p[j]\)

上面一项是因为两数互质,可以用积性函数的性质。

下面一项的证明:(可能很麻烦……反正是从别人那里看来的,不知道有没有更优秀的证明)

对于i,\([1,i)\)中与i不互质的数有\(i - \varphi(i)\)个。

对于任意数n,如果其与i互质,那么n+i与i互质。如果其与i不互质,那么n+i与i不互质。前者可以用反证法,后者是显然的。

可以推论得到,对于数i * p,其中与i不互质的数个数为\(i * p - p * \varphi(i)\)

那么显然有\(i * p - p * \varphi(i) = i * p - \varphi(i * p)\),所以\(p * \varphi(i) = \varphi(i * p)\)

4.线性求莫比乌斯函数。

莫比乌斯函数也是积性函数。根据其定义:

\(\mu(i) = 1\ (i = 1)\)

\(\mu(i) = (-1)^k\ (i = p_1p_2…p_k)\)

\(\mu(i) = 0\ (其余情况)\)

我们就可以得到其线性求法。对于质数,显然有\(mu(i) = -1\)

对于合数,如果正在被筛的数已经含有当前的最小素因子,那么说明这个正在被筛的数含有平方因子,所以\(\mu(i) = 0\)

否则根据定义\(\mu(i * p[j]) = \mu(i) * \mu(p[j])\),即\(\mu(i*p[j]) = -\mu(i)\)

5.线性求约数个数和约数和。

这个用到唯一分解定理的性质。

任意一个数n可以被唯一分解为若干个质数的若干次幂的乘积,即\(n = p_1^{a_1}p_2^{a_2}…p_k^{a_k}\)

记\(d(i)\)为约数个数,\(ds(i)\)为约数和。

则有\(d(n) = \prod_{i=1}^{k}(a_i + 1)\),这个很显然,就是每个质数取0~\(a_k\)次幂中的一个,乘法原理。

有\(ds(n) = (1 + p_1 + p_1^2 + … + p_1^{a_1}) * (1 + p_2 + p_2^2 + … + p_2 ^ {a_2}) * … *(1 + p_k + p_k^2 + … + p_k^{a_k})\),也就是\(ds(n) = \prod_{i=1}^k\sum_{j=0}^{a_i}p_i^j\)(这个似乎有点不利于理解??)

我们先说求约数个数。这里我们需要令\(num[i]\)表示i的最小素因子在i中的出现次数。

对于质数,有\(d[i] = 2,num[i] = 1\)

对于合数,那么如果这个数没有出现过,则很明显\(d[i * p[j]] = d[i] * d[p[j]],num[i * p[j]] = 1\)

否则这个数出现过,那么我们需要先除以最小素因子出现的次数+1,再乘以这个次数+2,并更新此值,也即是\(d[i*p[j]] = d[i] / (num[i] + 1) * (num[i] + 2),num[i*p[j]] = num[i] + 1\)

约数和与之是相似的。我们令\(dg(i)\)表示i的最小素因子的等比数列的和(就先这么叫吧??)

质数显然有\(ds[i] = dg[i] = i + 1\)

合数的话,如果这个数以前没出现过,那么\(ds[i*p[j]] = ds[i] * ds[p[j]]\)(可以看出这俩都是积性函数)\(dg[i*p[j]] = p[j]+1\)

否则和上一个一样,我们需要先除以这个等比数列,再乘上这个等比数列乘以当前质数+1.即\(ds[i*p[j]] = ds[i] / dg[i] * (dg[i] * p[j] + 1),dg[i*p[j]] = dg[i] * p[j] + 1\)

然后就完事啦。

(代码可能有误,未经测试)

#include<bits/stdc++.h>
#define rep(i,a,n) for(register int i = a;i <= n;i++)
#define per(i,n,a) for(register int i = n;i >= a;i--)
#define enter putchar(‘\n‘)
#define pr pair<int,int>
#define mp make_pair
#define fi first
#define sc second
using namespace std;
typedef long long ll;
const int M = 100005;
const int N = 10000005;
const int mod = 998244353;

int read()
{
   int ans = 0,op = 1;char ch = getchar();
   while(ch < ‘0‘ || ch > ‘9‘) {if(ch == ‘-‘) op = -1;ch = getchar();}
   while(ch >=‘0‘ && ch <= ‘9‘) ans = ans * 10 + ch - ‘0‘,ch = getchar();
   return ans * op;
}

int p[M],phi[M],mu[M],num[M],d[M],ds[M],dg[M],inv[M],tot;
bool np[M];

void euler()
{
   np[1] = 1,inv[0] = inv[1] = 1,mu[1] = 1,d[1] = 1,ds[1] = 1;
   rep(i,2,M-2)
   {
      inv[i] = (mod - mod / i) * inv[mod % i] % mod;
      if(!np[i]) p[++tot] = i,phi[i] = i-1,mu[i] = -1,d[i] = 2,num[i] = 1,ds[i] = dg[i] = i + 1;
      for(int j = 1,k = i * p[j];k <= M-2;j++)
      {
     np[k] = 1;
     if(!(i % p[j]))
     {
        phi[k] = phi[i] * p[j];
        d[k] = d[i] / (num[i] + 1) * (num[i] + 2),num[k] = num[i] + 1;
        ds[k] = ds[i] / dg[i] * (dg[i] * p[j] + 1),dg[k] = dg[i] * p[j] + 1;
     }
     phi[k] = phi[i] * phi[p[j]];
     d[k] = d[i] * d[p[j]],num[k] = 1;
     ds[k] = ds[i] * ds[p[j]],dg[k] = p[j] + 1;
      }
   }
}

int main()
{
   euler();
   return 0;
}

原文地址:https://www.cnblogs.com/captain1/p/10357061.html

时间: 2024-11-02 01:35:19

线性筛合集的相关文章

模板 - 数论 - 线性筛

各种线性筛的合集: https://www.cnblogs.com/zhoushuyu/p/8275530.html 常见积性函数: μ(n):莫比乌斯函数φ(n):欧拉函数d(n):一个数nn的约数个数σ(n):一个数nn的约数和f(x)=x^k(k∈N):这个玩意儿也是积性函数 线性筛素数 int pri[N],tot,zhi[N];//zhi[i]为1的表示不是质数 void sieve() { zhi[1]=1; for (int i=2;i<=n;i++) { if (!zhi[i])

[题解+总结]动态规划大合集II

1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2.lis 最长上升子序列 唯一一道裸题,但是O(n^2)过不了,临时看了看O(n log n)的二分做法和线段树做法.先来讲讲简单的二分做法,其本质就是在O(n^2)上进行优化,需要证明一个结论.设当前处理数列第k位,存在: (1)a[i]<a[j]<a[k]: (2)i<j<k: (3

从零开始学数据分析,什么程度可以找到工作?( 内附20G、5000分钟数据分析工具教程大合集 )

从零开始学数据分析,什么程度可以找到工作?( 内附20G.5000分钟数据分析工具教程大合集 ) 我现在在Coursera上面学data science 中的R programming,过去很少接触过统计.计算机这两个学科,现在很想转行做数据.问题如下: 1.Data需要学到什么程度可以找工作?2.初级的数据分析会做哪些工作?3.数据分析有什么小方向吗?4.想要深度做数据分析有怎样的建议? 5.统计的学习应该从哪里下手? 本文将给你以上问题所有答案,文末还有UniCareer为大家独家整理的20

最新最全的 Android 开源项目合集

原文链接:https://github.com/opendigg/awesome-github-android-ui 在 Github 上做了一个很新的 Android 开发相关开源项目汇总,涉及到 Android 开发的方方面面,基本很全了.对 Android 开发感兴趣的欢迎 Star ,后续也会定期维护更新这个列表.当然,你也可以去 opendigg 上查看. -- 由欧戈分享 awesome-github-android-ui 是由OpenDigg整理并维护的安卓UI相关开源项目库集合.

机器学习和深度学习资料合集

机器学习和深度学习资料合集 注:机器学习资料篇目一共500条,篇目二开始更新 希望转载的朋友,你可以不用联系我.但是一定要保留原文链接,因为这个项目还在继续也在不定期更新.希望看到文章的朋友能够学到更多.此外:某些资料在中国访问需要梯子. <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.Deep Learning. <Deep Learning in

Matlab命令合集 妈妈再也不用担心我不会用matlab了

matlab命令 一.常用对象操作:除了一般windows窗口的常用功能键外.1.!dir 可以查看当前工作目录的文件. !dir& 可以在dos状态下查看.2.who 可以查看当前工作空间变量名, whos 可以查看变量名细节.3.功能键:功能键 快捷键 说明方向上键 Ctrl+P 返回前一行输入方向下键 Ctrl+N 返回下一行输入方向左键 Ctrl+B 光标向后移一个字符方向右键 Ctrl+F 光标向前移一个字符Ctrl+方向右键 Ctrl+R 光标向右移一个字符Ctrl+方向左键 Ctr

LeetCode合集

一 线性表 1.1  数组 1.1.1 Remove Duplicates from Sorted Array 1.1.2 Remove Duplicates from Sorted Array II 1.1.3 Search in Rotated Sorted Array 1.1.4 Search in Rotated Sorted Array II 1.1.5 Median of Two Sorted Arrays 1.1.6 Longest Consecutive Sequence 1.1

线性筛素数详细整理

如果你在1个月前让我判断素数,我一定会猛敲出以下代码: bool check( int num ) { int tmp =sqrt( num); for(int i= 2;i <=tmp; i++) if(num %i== 0) return 0 ; return 1 ; //实在是太慢了! } $ $ 下面给大家带来3种筛选素数和一种直接判断素数 $ $ $ $ 什么是线性筛? 对于求多个质数时与其一个个判断不如用排除法,用空间换取大量时间. $ $ $ $ $ $ 一般筛法(埃拉托斯特尼筛法

数论入门——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛

一个菜鸡对数论的一点点理解... 莫比乌斯函数 定义函数\(\mu(n)\)为: 当n有平方因子时,\(\mu(n)=0\). 当n没有平方因子时,\(\mu(n)=(-1)^{\omega(n)}\),\(\omega(n)\)表示n不同质因子的个数. 性质1: \(\sum_{d|n}\mu(d)=[n=1]\) 证明:我们把n分解质因数,则原式\(=(-1+1)^{\omega(n)}=0\). 因为对于不同的质因子,只有选和不选两种方案,这是一个组合数相加的形式,偶数加奇数减,根据二项式