积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和
积性函数
定义
积性函数:对于任意互质的整数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 ...
随机推荐
- Scrum是脆弱的,不敏捷的
正如标题所示,这篇文章是关于 Scrum 的两个不同方面.第一部分涉及 Scrum 不敏捷,第二部分涉及 Scrum 脆弱. 在详细介绍之前,简短的免责声明:我在这篇文章(以及一般博客中)中提出的所有 ...
- 使用java Apache poi 根据word模板生成word报表
项目开发过程中,客户提出一堆导出报表的需求,需要导出word格式,页眉还需要加上客户公司的logo,试了几种方案,最后选择了用 Apache poi 加上自定义标签的方式实现. 目前功能还比较简单,一 ...
- 小白学python-day04-作业-九九乘法表相关
作业内容: 作业一: 作业二: 作业三: (1) (2) \n换行 \t制表符 end="" 代表打印不换行,双引号里面可以在结果之间加字符. print() 代表换行打印,使用时 ...
- Supalle-Admin-Layout,一个PC端和手机端都合适用的后台页面模板
Supalle-Admin-Layout主要使用有Vue.Element-UI.layui-icon,Ajax实现采用Fetch(是有这个打算,不过目前是jQuery.). 源码地址:https:// ...
- JavaScript基础学习第六天
目标: 能够使用对象的方式处理数据 ☞ 代码预解析: 1. 变量提升 :当程序中遇到定义变量后,就会将该变量的定义提升到当前作用域的开始位置,不包括变量的赋值 2. 函数提升:当程序中遇到函数的声明时 ...
- handlerAdapter与方法调用(参数的解析)
前提:当找到handler以后,那么就要让handler发挥作用,这个时候handlerAdapter就派上用场了 这里面比较复杂就是requestMappingHandlerAdapter了,其他的 ...
- 第三章 基础算法和数据结构高频题 I
区间类问题 1 Missing Interval public List<String> findMissingRanges(int[] nums, int lower, int uppe ...
- Unity3D热更新之LuaFramework篇[09]--资源热更新与代码热更新的具体实现
前言 在上一篇文章 Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建 中,我介绍了热更新的基本原理,并且着手搭建一台服务器. 本篇就做一个实战练习,真正的来实现热 ...
- PAY8 数字货币支付结算系统,全球付!实时结算!秒到账!
数字货币支付是历史发展的必然 如今已经有越来越多的地方接受加密数字货币作为支付消费了,比如泰国电影院连锁店 Cineplex Group 可用加密货币买爆米花和电影票,西班牙一精品酒店接受数字货币支付 ...
- Android 开发使用自定义字体
有时候,系统自带的字体并不能满足我们特殊的需求,这时候就需要引用其他的字体了,可以把下载的字体文件放在 assets 目录下. 自定义字体文件不能使用xml代码读取而应该使用java代码: publi ...