积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和
积性函数
定义
积性函数:对于任意互质的整数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;
}
}
}
}
积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和的更多相关文章
- The Euler function(线性筛欧拉函数)
/* 题意:(n)表示小于n与n互质的数有多少个,给你两个数a,b让你计算a+(a+1)+(a+2)+......+b; 初步思路:暴力搞一下,打表 #放弃:打了十几分钟没打完 #改进:欧拉函数:具体 ...
- 素数的线性筛 && 欧拉函数
O(n) 筛选素数 #include<bits/stdc++.h> using namespace std; const int M = 1e6 + 10 ; int mindiv[M] ...
- [bzoj 2190][SDOI2008]仪仗队(线性筛欧拉函数)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2190 分析:就是要线性筛出欧拉函数... 直接贴代码了: memset(ans,,sizeof ...
- BZOJ 2190 仪仗队(线性筛欧拉函数)
简化题意可知,实际上题目求得是gcd(i,j)=1(i,j<=n)的数对数目. 线性筛出n大小的欧拉表,求和*2+1即可.需要特判1. # include <cstdio> # in ...
- Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2560 Solved: 857[Submit][St ...
- poj1248 (线性筛欧拉函数)(原根)
强烈鸣谢wddwjlss 题目大意:给出一个奇素数,求出他的原根的个数,多组数据. 这里先介绍一些基本性质 阶 设\((a,m)=1\),满足\(a^r \equiv 1 \pmod m\)的最小正整 ...
- noip复习——线性筛(欧拉筛)
整数的唯一分解定理: \(\forall A\in \mathbb {N} ,\,A>1\quad \exists \prod\limits _{i=1}^{s}p_{i}^{a_{i}}=A\ ...
- 【线性筛】【筛法求素数】【约数个数定理】URAL - 2070 - Interesting Numbers
素数必然符合题意. 对于合数,如若它是某个素数x的k次方(k为某个素数y减去1),一定不符合题意.只需找出这些数. 由约数个数定理,其他合数一定符合题意. 就从小到大枚举素数,然后把它的素数-1次方都 ...
- 【bzoj2401】陶陶的难题I “高精度”+欧拉函数+线性筛
题目描述 求 输入 第一行包含一个正整数T,表示有T组测试数据.接下来T<=10^5行,每行给出一个正整数N,N<=10^6. 输出 包含T行,依次给出对应的答案. 样例输入 7 1 10 ...
随机推荐
- @ImportResource导入的xml配置里的Bean能够使用@PropertySource导入的属性值吗?
每篇一句 大师都是偏执的,偏执才能产生力量,妥协是没有力量的.你对全世界妥协了你就是空气.所以若没有偏见,哪来的大师呢 相关阅读 [小家Spring]详解PropertyPlaceholderConf ...
- sql 数据处理时join字段慎重选择--避免出现double数据!
前几天做BI Tabular表格模型的时候,数据中心核对数据发现模型展现数据比实际数据要多,经过核查之后,发现原来我是一个不经意,在做数据选取的时候,inner join的字段CITY_NAME_CN ...
- Dapper学习笔记
听说有个轻量化的orm Dapper,我就去了解下.试着对Sql Server和Mysql进行增删改查,体验不错.它不如EF臃肿,也比一般的封装灵活,比如我们封装了一个映射类.利用反射,在Execut ...
- Linux 系统的基本操作及工具的使用
基本操作命令如:useradd.userdel.passwd.su 添加用户.删除用户.修改密码.切换用户 ls.ll.cd.cp.mv.chmod ps.kil.man mkdir.touch.ta ...
- 洛谷P3905 道路重建
题目:https://www.luogu.org/problemnew/show/P3905 分析: 此题是显然的最短路算法,只是看到一起删掉的一堆边感到十分棘手,而且还要求出的是最短添加边的总长度 ...
- Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?
导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...
- 前端插件之Bootstrap Dual Listbox使用
工欲善其事,必先利其器 对于很多非专业前端开发来说写页面是非常痛苦的,借助框架或插件往往能够达到事半功倍的效果,本系列文章会介绍我在运维系统开发过程中用到的那些顺手的前端插件,如果你是想写XX管理系统 ...
- 《VR入门系列教程》之2---VR头显
什么是虚拟现实? 虚拟现实的目标:让人们相信真实地处于一个虚拟世界中.要达到这个目标就得让人们的大脑(负责视觉和运动感知部分)欺骗他们.不同技术合在一起才可以创造这种幻觉,包括: 全立 ...
- JQuery操作CheckBox 第二次无法选中的问题
用JQuery做CheckBox全选和反选的时候,遇到一个问题.当用JQ控制全选,全取消一次以后,再次点击全选,发现代码变了,但是CheckBox没有处于选中状态. 百度后得知: 我使用的方法是 $( ...
- 上车时机已到--.NETCore是适应时代发展的雄鹰利剑
上车时机已到--.NETCore是适应时代发展的雄鹰利剑 要起飞了 .NET Core 3.0-prevew7:https://dotnet.microsoft.com/download/dotnet ...