博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[常见积性函数的线性筛]【学习笔记】
阅读量:5268 次
发布时间:2019-06-14

本文共 1328 字,大约阅读时间需要 4 分钟。

update:2017-04-16

当时写的比较naive,现在还是不要看了

 

【欧拉函数】

φ(n)=n(1-1/p1)(1-1/p2)...(1-1/pk)

通过上式易发现 p[j]|i时 phi[i*p[j]]=phi[i]*p[j] 因为phi[i]的n是n*p[j]/p[j],其他的部分一样

[2017-01-02]

一种更感性的理解

就是说,phi[i]与phi[i*p[j]] 本来i有p[j]这个质因子,他们的差别就只有式子中开始的n了,只要乘上p[j]就可以了

没有p[j]的话,就是*(p[j]-1)/p[j]在处理n的差别*p[j],最后就是p[j]-1;了

 

证明:http://www.cnblogs.com/candy99/p/6200660.html

void sieve(){    phi[1]=1;    for(int i=2;i<=n;i++){        if(!vis[i]){            p[++m]=i;            phi[i]=i-1;        }        for(int j=1;j<=m&&i*p[j]<=n;j++){            vis[i*p[j]]=1;            if(i%p[j]==0){                phi[i*p[j]]=phi[i]*p[j];                break;            }            phi[i*p[j]]=phi[i]*(p[j]-1);        }    }    for(int i=1;i<=n;i++) s[i]=s[i-1]+phi[i];}

【约数个数】

根据乘法原理,n的约数个数为∏{i=1...r}(ai+1)

由上式可得 p[j]|i时 facnum[i*p[j]]=facnum[i]/(minfac[i]+1)*(minfac[i*p[j]]+1)

 


 

【约数和】

n=p1^a1*p2^a2*…*pr^ar 

则其约数和=∏{i=1...r}(Σ{j=0..aj}pi^j) 就是考虑每个约数中的每个质因子选的指数
p[j]|i时,得到sumfac[i*p[j]]   (一下分析中a省去在那个数中)
需要除以Σ{i=1...a[minfac[i]]}p[j]^i
再乘以Σ{i=1...a[minfac[k]]}p[j]^i
其中a[minfac[k]]=a[minfac[i]]+1 
这样开两个辅助数组记录 
t1[i]=Σ{i=0...a[minfac[i]]}minfac[i]^i
t2[i]=mindiv[i]^a[minfac[i]]

 
int notp[N],p[N],mu[N],minfac[N],t1[N],t2[N],sf[N];
void sieve(){
mu[1]=1; sf[1].s=1; for(int i=2;i

 还有一种方法,每个数i暴力更新倍数,时间也差不多

转载于:https://www.cnblogs.com/candy99/p/6213335.html

你可能感兴趣的文章
css3学习01
查看>>
【USACO】 奶牛会展
查看>>
继承和多态
查看>>
Dijkstra+计算几何 POJ 2502 Subway
查看>>
修复IE不能执行JS的方法
查看>>
程序员究竟该如何提高效率zt
查看>>
希尔排序法(缩小增量法)
查看>>
PHP编程基础学习(一)——数据类型
查看>>
MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询
查看>>
NPOI处理Word文本中上下角标
查看>>
Android笔记 Handler
查看>>
如何阅读大型前端开源项目的源码(转)
查看>>
java.util.Arrays类详解
查看>>
idea搭建tocmat
查看>>
NYOJ-626-intersection set(二分查找)
查看>>
项目管理之路(1):初步踏入项目管理
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
echarts饼图显示百分比
查看>>
JMS消息
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>