解法:待填坑
其實這個完全可以拓展到線性篩求積性函式
因為非完全積 所以在兩數不互質的情況下不可以直接相乘
但是兩數互質的情況下就可以直接相乘
下面需要討論下不互質的情況 我設定乙個陣列min_factory_a表示我這個數的最小質因子乘起來是多少 因為非完全積性,那麼其實我們每次列舉到i%prime[j]==0的時候就是因為這個prime[j](仔細考慮線性篩)的出現會導致答案有所不同 於是我們想辦法把這部分的貢獻都除掉 然後再乘以這部分+新的prime[j]後生成的新的貢獻就可以了
#include
#define n 110000000
int sigma[n],min_factory_a[n],prime[n/10],not_prime[n],n;
int main()
for (int j=1;prime[j]*i
<=n;++j)sigma[i*prime[j]]=sigma[i]*(prime[j]+1);
min_factory_a[i*prime[j]]=prime[j];}}
for (int i=1;i<=n;++i) printf("%d\n",sigma[i]);
return
0;}
數論 線性篩 約數個數與約數和
參考部落格 參考部落格 參考部落格 這個講的挺好 預備知識點 大於1的數n可以分解質因數 n p1a1 p2a2 p3a3 pka n的約數的個數是 a1 1 a2 1 a3 1 ak 1 我們先用線性篩來篩出素數 bool mark maxn int prim maxn int cnt void ...
線性篩2 篩約數個數
根據唯一分解定理 n p 1 p 2 p q 任意質因子的任意次冪都可以隨意組合,所以根據乘法原理 n 的約數個數為 1 k 1 1 k 2 1 k 3 1 k q so,可以根據這個線性篩約數個數 首先設 num i 為 i 的 k 1 也就是最小質因數的指數 d i 為 i 的約數個數 然後根據...
約數定理 線性篩素數
約數定理 已知線性篩法打d x 表 每個數都是被它最小的素因子篩掉的,那麼用g i 表示i的最小素因子的冪次,注意d x 的表示式,它是部分積性函式d p1 a1 p2 a2 d p1 a1 d p2 a2 void init 思想證明 理解 中 if i primes j 0 break 的關鍵 ...