只会搬运YL巨巨的博客

积性函数

定义

积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数。

完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数

性质

  • 两个积性函数的狄利克雷卷积仍为积性函数。
  • 若积性函数满足 \(f(n^p)=f^p(n)\)则它一定是完全积性函数。因为一个数可以唯一分解,则它一定可以表示成质数相乘的形式;因为他时积性函数所以,\(f(\prod_{i=1}^{n}p_i)=\prod _{i=1}^{n}f(p_i)\),又因为满足上面的式子,所以一定为积性函数。
  • 积性函数值都可以线性筛(我也不知道为什么)

常见的积性函数和筛法

欧拉函数

首先积性函数先分解,分解成质数的乘积。这样你每次都是用质数乘以当前的数筛到下一个数,得到下一个数的函数值。

而euler函数是积性函数,不是完全积性函数。所以在当前枚举到的数的时候要分两种情况讨论:

case1:当\(i\%prime[j]!=0\)时,这个时候显然两个数互质,可以直接相乘筛到下一个数。

case2: 当\(i\%prime[j]==0\)这样显然不能直接相乘了,但我们考虑,对i的每个因子f[x],都可以表示出\(f[x]*k,k<=prime[j]\)这个prime[j] *i的因子。所以在这种情况下\(phi[i*prime[j]]=phi[i]*prime[j];\)

int is[maxn],phi[maxn],prime[maxn],n,cnt;
void euler()
{
is[1]=1;phi[1]=1;
for(int i=1;i<=n;i++)
{
if(!is[i]){prime[++cnt]=i;phi[i]=i-1;}
for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
{
is[prime[j]*i]=1;
if(i%prime[j]){phi[i*prime[j]]=phi[i]*(prime[j]-1);}
else{phi[i*prime[j]]=prime[j]*phi[i];break;}
}
}
}

莫比乌斯函数

一样拆成质数相乘的形式,但是要注意莫比乌斯函数只有在质因子个数为奇数的时候答案才会为-1或+1,所以对每个质因子只筛一次。

void mobius()
{
is[1]=1;mu[1]=1;
for(int i=1;i<=n;i++)
{
if(!is[i]){prime[++cnt]=i;mu[i]=-1;}
for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
{
is[prime[j]*i]=1;
if(!(i%prime[j]))break;
mu[i*prime[j]]=-mu[i];
}
}
}

因数个数和

还是拆成素数积的形式。只是再记录一个最小质因子的指数就可以了。为什么是最小的?因为每次我们筛数的时候,它总是被它最小的质因子先筛到,而我们知道i的约数,又知道它最小的质因子的个数,那么i*prime[j]肯定是可以算出来了。一样分情况讨论。

当i是质数的时候,它的约数就是1和它本身。

当i%prime[j]==0的时候,先除掉它原来最小质因子对约数的贡献,再乘上最小质因子个数加1,就是i×prime[j]的约数个数了。

当i%prime[j]!=0的时候,这个时候枚举到的这一个质数是原来i中没有的,那它的贡献一定是2,所以在i的约数上乘以二就可以了。

int is[maxn],fac[maxn],prime[maxn],n,cnt,pre[maxn];
void factor()
{
is[1]=1;fac[1]=1;
for(int i=1;i<=n;i++)
{
if(!is[i]){prime[++cnt]=i;fac[i]=2;pre[i]=1;}
for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
{
is[prime[j]*i]=1;
if(i%prime[j])
{
fac[i*prime[j]]=2*fac[i];
pre[i*prime[j]]=1;
}
else
{
pre[i*prime[j]]=pre[i]+1;
fac[i*prime[j]]=fac[i]/(pre[i]+1)*(pre[i]+2);
break;
}
}
}
}

因数和

思考一下发现要求的答案其实就是\(ans_x=\prod_{p|x,p\in prime}\sum_{j=1}^{k_p}p^j\)

那么我们线性筛的时候,由于写成可以写成\(\sigma=id*e\)也就是积性函数和积性函数积的形式,那么可以利用积性函数的性质,然后再记录一个最小质因子的指数次幂和最质因子指数幂的和,即\(\sum_{j=1}^{k_p}p^j\)

就可以线性筛了.

int sig[maxn],sum[maxn],pre[maxn];
//约数的和/最小质因子指数次幂和/最小质因子的指数次幂
int prime[maxn],is[maxn],p[maxn],cnt;
void init(int n)
{
sig[1]=1;is[1]=1;
for(int i=2;i<=n;i++)
{
if(!is[i])
{
prime[++cnt]=i;
sig[i]=i+1,sum[i]=i+1,pre[i]=i;
}
for(int j=1;j<=cnt&&prime[j]*i<=n;j++)
{
is[prime[j]*i]=1;
if(i%prime[j])
{
sig[i*prime[j]]=sig[i]*sig[prime[j]];
sum[i*prime[j]]=prime[j]+1;
pre[i*prime[j]]=prime[j];
}
else
{
pre[i*prime[j]]=prime[j]*pre[i];
sum[i*prime[j]]=sum[i]+pre[i*prime[j]];
sig[i*prime[j]]=sig[i]/sum[i]*sum[i*prime[j]];
break;
}
}
}
}

积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和的更多相关文章

  1. The Euler function(线性筛欧拉函数)

    /* 题意:(n)表示小于n与n互质的数有多少个,给你两个数a,b让你计算a+(a+1)+(a+2)+......+b; 初步思路:暴力搞一下,打表 #放弃:打了十几分钟没打完 #改进:欧拉函数:具体 ...

  2. 素数的线性筛 && 欧拉函数

    O(n) 筛选素数 #include<bits/stdc++.h> using namespace std; const int M = 1e6 + 10 ; int mindiv[M] ...

  3. [bzoj 2190][SDOI2008]仪仗队(线性筛欧拉函数)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2190 分析:就是要线性筛出欧拉函数... 直接贴代码了: memset(ans,,sizeof ...

  4. BZOJ 2190 仪仗队(线性筛欧拉函数)

    简化题意可知,实际上题目求得是gcd(i,j)=1(i,j<=n)的数对数目. 线性筛出n大小的欧拉表,求和*2+1即可.需要特判1. # include <cstdio> # in ...

  5. Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2560  Solved: 857[Submit][St ...

  6. poj1248 (线性筛欧拉函数)(原根)

    强烈鸣谢wddwjlss 题目大意:给出一个奇素数,求出他的原根的个数,多组数据. 这里先介绍一些基本性质 阶 设\((a,m)=1\),满足\(a^r \equiv 1 \pmod m\)的最小正整 ...

  7. noip复习——线性筛(欧拉筛)

    整数的唯一分解定理: \(\forall A\in \mathbb {N} ,\,A>1\quad \exists \prod\limits _{i=1}^{s}p_{i}^{a_{i}}=A\ ...

  8. 【线性筛】【筛法求素数】【约数个数定理】URAL - 2070 - Interesting Numbers

    素数必然符合题意. 对于合数,如若它是某个素数x的k次方(k为某个素数y减去1),一定不符合题意.只需找出这些数. 由约数个数定理,其他合数一定符合题意. 就从小到大枚举素数,然后把它的素数-1次方都 ...

  9. 【bzoj2401】陶陶的难题I “高精度”+欧拉函数+线性筛

    题目描述 求 输入 第一行包含一个正整数T,表示有T组测试数据.接下来T<=10^5行,每行给出一个正整数N,N<=10^6. 输出 包含T行,依次给出对应的答案. 样例输入 7 1 10 ...

随机推荐

  1. 【最小生成树之Kruskal算法】

    看完之后推荐再看一看[最小生成树之Prim算法]-C++ 定义:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最小生成树可以用kr ...

  2. 【模拟】(正解树状数组)-校长的问题-C++-计蒜客

    描述 学校中有 n 名学生,学号分别为 1 - n.再一次考试过后,学校按照学生的分数排了一个名次(分数一样,按照名字的字典序排序).你是一名老师,你明天要和校长汇报这次考试的考试情况,校长询问的方式 ...

  3. Ubuntu 18.04 root 使用ssh密钥远程登陆

    前言: Ubuntu默认是禁止root用户远程登陆 本教程解决Ubuntu 18.04版本 root用户 使用ssh密钥无法远程登陆的问题 问题发生的环境: 腾讯云,重装Ubuntu服务器时选择使用s ...

  4. CentOS 7离线安装Ansible

    前言 我一直都想成为自动化运维界最亮的仔,奈何自己实力不允许.不过,我一直都在奋斗的路上:这不,最近就在学习自动化运维界的神器--Ansible. 要系统的学习一下Ansible,那就是要先搭建学习环 ...

  5. 如何在一个项目中兼容Wepy和Taro?

    背景交待 NJ 项目启动初期,团队技术栈主要是基于 Vue,技术选择上就选择了类 Vue 的 wepy.迭代几个版本后 mpvue 出来了,简单调研了下,准备基于 mpvue-simple 开发部分页 ...

  6. Java NIO学习系列五:I/O模型

    前面总结了很多IO.NIO相关的基础知识点,还总结了IO和NIO之间的区别及各自适用场景,本文会从另一个视角来学习一下IO,即IO模型.什么是IO模型?对于不同人.在不同场景下给出的答案是不同的,所以 ...

  7. golang从context源码领悟接口的设计

    注:写帖子时go的版本是1.12.7 go语言中实现一个interface不用像其他语言一样需要显示的声明实现接口.go语言只要实现了某interface的方法就可以做类型转换.go语言没有继承的概念 ...

  8. 配置 IDEA 远程连接应用服务器

    当调试 Web 应用时,经常需要使用 ide 远程连接,来进行 debug 调试.使用 Springboot 内置服务器和使用 Tomcat 服务器是常见的应用部署方式,可以用不同的配置方式来启动远程 ...

  9. go mod 无法自动下载依赖包的问题

    go 11以后启用了go mod功能,用于管理依赖包. 当执行go mod init生成go.mod文件之后,golang在运行.编译项目的时候,都会检查依赖并下载依赖包. 在启动了go mod之后, ...

  10. 第一章: 初识Java

    计算机程序:计算机为完成某些功能产生的一系列有序指令集合. Java技术包括:JavaSE(标准版) JavaEE(企业版) ---JavaME(移动版) 开发Java程序步骤:1.编写 2.编译 3 ...