oi中有時需要我們線性篩某些函式,我們篩的主要是積性函式
1st:線性篩素數
#include#includeusing namespace std;2nd:尤拉函式線性篩:const int maxn=1e4+5;
int n,prime[maxn],vis[maxn],tot;
void get_prime(int n) }}
int main()
#include#includeusing namespace std;尤拉函式其他求法:const int maxn=1e4+5;
int n,prime[maxn],vis[maxn],phi[maxn],tot;
void get_phi(int n)
phi[i*prime[j]]=phi[i]*phi[prime[j]];
} }}int main()
求單個數的尤拉函式:
1 #include2 #include3 #include4 #include5view codeusing
namespace
std;
6intn;7
int phi(int
n)14}15
if(n>1) m=m/n*(n-1
);16
return
m;17}18
intmain()
複雜度略大於線性的求法:
1 #include2 #include3 #include4 #include5view codeusing
namespace
std;
6int n,phi[1000006];7
void get_phi(int
n)14}15
}16}17
intmain()
23return0;
24 }
尤拉函式乙個性質:$\sum\limits_\phi(d)=n$
3rd:莫比烏斯函式線性篩(雖然我不知道莫比烏斯函式是什麼以及怎麼用)
#include#includeusing namespace std;4th:線性篩約數個數:const int maxn=1e4+5;
int n,prime[maxn],vis[maxn],mu[maxn],tot;
void get_mu(int n)
mu[i*prime[j]]=mu[i]*mu[prime[j]];
//根據莫比烏斯函式的定義,這裡也可以寫為
//mu[i*prime[j]]=-mu[i];
} }}int main()
#include#includeusing namespace std;5th:線性篩約數和:const int maxn=1e4+5;
int n,prime[maxn],vis[maxn],d[maxn],tot,a[maxn];
void get_d(int n)
d[i*prime[j]]=d[i]*d[prime[j]];
a[i*prime[j]]=1;
} }}int main()
#include#includeusing namespace std;6th:其他積性函式?卷積?不會了。。。const int maxn=1e4+10;
int n,prime[maxn],vis[maxn],sd[maxn],sum[maxn],low[maxn],tot;
void getsumd(int n)
low[i*prime[j]]=prime[j];
sum[i*prime[j]]=prime[j]+1;
//這裡low和sum不是積性函式
sd[i*prime[j]]=sd[i]*sd[prime[j]];}}
}int main()
偽**:
vis[1] = low[1] = 1; h[1] = 初始化for(int i = 2; i <= n; i++)
h[i * prime[j]] = h[i] * h[prime[j]];
low[i * prime[j]] = prime[j];}}
線性篩篩積性函式
概念 定義域為正整數的函式是數論函式。設p,q互質,f p q f p f q 稱f為積性函式。如約數,尤拉,莫比烏斯。任意p,q,f p q f p f q 稱f為完全積性函式。如1函式,即f i 1。我們一般用線性篩就可以預處理積性函式。尤拉phi void phii for int j 1 j...
線性篩法與積性函式
尤拉函式 1.varphi p p 1 證明 顯然 2.varphi i p p varphi i if space i bmod p 0 引理1 varphi p a p 1 p 證明 比 p a 小的數一共有 p a 1 個,其中與 p a 不互質的且小於 p a 的 即 p 的倍數 p t 一...
積性函式篩法
很多常用的數論函式都是積性函式,而在題目中,我們常常需要線性 甚至更高 的篩法。對於積性函式,我們可以在篩素數的基礎上稍加修改,即可完成線性篩。首先,注意到積性函式的特點 f xy f x times f y 而可以線性篩的積性函式,需要知道以下兩個式子的快速求法 f p quad f p k p ...