只会搬运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. python基础一整型、bool、字符串

    1整型.bool.字符串 1.整型 --数字(int) ​ 用于比较运算的 ​ 32位 -2 ** 31 ~ 2 ** 31 -1 ​ 64位 -2 ** 63 ~ 2 ** 63 -1 ​ 基础运算 ...

  2. 为什么说是时候拥抱.NET CORE了?

    微软和社区已经做了大量艰苦的工作,使.Net Core成为市场上具有竞争力的框架,帮助开发人员快速开发具有最佳性能和可扩展性的强大应用程序.做的最棒的事情是.Net Framework开发人员不需要任 ...

  3. 【CYH-02】NOIp考砸后虐题赛:坐标:题解

    代码: 这道题也并不难,用排序+简单动规即可.因为@Kevin_Wa 大佬放的是c++,所以我来一发Pascal. var min,max,i,a1,b1,c1,d1,n:longint; a,b,c ...

  4. 博客一键保存本地exe可视化界面文件

    说明 非常感谢nick老师的提点老师博客:https://home.cnblogs.com/u/nickchen121/ 项目连接 1.码云:https://gitee.com/wjup/html_t ...

  5. React躬行记(10)——高阶组件

    高阶组件(High Order Component,简称HOC)不是一个真的组件,而是一个没有副作用的纯函数,以组件作为参数,返回一个功能增强的新组件,在很多第三方库(例如Redux.Relay等)中 ...

  6. Swagger UI使用指南

    1:认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法 ...

  7. mybatis动态插入数据库

    <insert id="dynamicAddUser"> insert into t_user <!-- trim 对所有的表中列名 进行动态处理 --> ...

  8. 【iOS】沙盒目录

    有关沙盒目录参考: http://blog.csdn.net/totogo2010/article/details/7669837 获取沙盒路径,参考代码: NSArray *paths = NSSe ...

  9. 【iOS】App Transport Security

    iOS9中新增App Transport Security(简称ATS)特性, 主要使到原来请求的时候用到的HTTP,都转向TLS1.2协议进行传输.这也意味着所有的HTTP协议都强制使用了HTTPS ...

  10. 【iOS】no identity found Command /usr/bin/codesign failed with exit code 1

    今天遇到了这个问题,详情如下图: 后来发现是自己脑子短路了……只添加了 Provisioning Profiles, 而忘记添加 Certificates, 就是下面的两个: