标签:质数 快速 自然数 一个 int 完全 结果 时间 线性
模拟赛考了一道莫反结果只写了低档暴力
定义完全积性函数:定义域在\(>0\)的自然数内。
有\(f(ab)=f(a)f(b)\)
例子:\(f(a)=a\)
定义积性函数:如果\((a,b)=1,f(ab)=f(a)f(b)\)
推论:设\(a\)的唯一分解:\(p_1^{b1}p_2^{b2}...p_n^{bn}\),则\(f(a)=f(p_1^{b1})f(p_2^{b2})...f(p_n^{bn})\)
积性函数的求法:线性筛。
在遍历所有倍数的过程中:
要求当\(i\mod p=0\)时,则\(f(ip)\)的值能够被算出。
当\(i\mod p\neq 0\)时,按照积性函数的性质计算\(f(ip)\)
所以线性筛法要求:在质数处的取值能够快速算出,一个数和质数的乘积的函数值可以快速算出。
事实上,根据素数定理,我们只需要做\(\frac{n}{\log_2n}\)次函数在质数处的求值。
这使得我们可以在几乎线性的时间内求出所有\(i^k\)。
定义两个函数的dirchlet卷积:\(h(n)=\sum f(\frac{n}{i})g(i)\)
其中\(i|n\)
定义mobius函数\(u\)。
它的函数值:
当\(a=1\),\(u(a)=1\)
设\(a\)的唯一分解:\(p_1^{b1}p_2^{b2}...p_n^{bn}\)
当\(b_1=b_2=...=b_n=1\),则\(u(a)=(-1)^n\)
否则\(u(a)=0\)
这事实上满足上面筛法对与积性函数的约定,所以可以线性筛求出。
定义dirchlet前缀和:\(b(n)=\sum a(\frac{n}{i})\),其中\(i|n\)
它有两种做法:
做法1:枚举\(a(x)\),贡献到\(x\)的倍数。
时间复杂度\(O(n\log_2n)\)
做法2:魔力筛
void si(int *a){
for(int i=1;p[i]<=n;i++)
for(int j=1;j*p[i]<=n;j++)
a[j*p[i]]+=a[j];
}
\(p\)是素数表。
考虑\(j\)的唯一分解,发现事实上它是在按照质数从小到大的顺序做高维前缀和。
这就证明了它的正确性
可以证明时间复杂度是\(O(n\log_2\log_2n)\)
标签:质数 快速 自然数 一个 int 完全 结果 时间 线性
原文地址:https://www.cnblogs.com/ctmlpfs/p/14707324.html