51nod 1244 杜教篩模板 莫比烏斯函式之和

2021-08-08 16:58:15 字數 1497 閱讀 8767

51nod 1244 莫比烏斯函式之和

基準時間限制:3 秒 空間限制:131072 kb 分值: 320 難度:7級演算法題

收藏 關注

莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯(mertens)首先使用μ(n)(miu(n))作為莫比烏斯函式的記號。具體定義如下:

如果乙個數包含平方因子,那麼miu(n) = 0。例如:miu(4), miu(12), miu(18) = 0。

如果乙個數不包含平方因子,並且有k個不同的質因子,那麼miu(n) = (-1)^k。例如:miu(2), miu(3), miu(30) = -1,miu(1), miu(6), miu(10) = 1。

給出乙個區間[a,b],s(a,b) = miu(a) + miu(a + 1) + …… miu(b)。

例如:s(3, 10) = miu(3) + miu(4) + miu(5) + miu(6) + miu(7) + miu(8) + miu(9) + miu(10)

= -1 + 0 + -1 + 1 + -1 + 0 + 0 + 1 = -1。

input

輸入包括兩個數a, b,中間用空格分隔(2 <= a <= b <= 10^10)

output

輸出s(a, b)。

10^10 的資料,線性篩法肯定是過不了的。要怎麼做呢?

是一種求積性函式字首和的篩法。可以在

o(n^(2/3))的時間中快速求出積性函式f(n)的字首和f(n)。

如何做到呢?

首先令f(n)為f(n)的字首和,g(n)為g(n)的字首和,且滿足g(n)=∑i|nf(i),則有:

g(n)=∑ni=1g(i)

=∑(n,i=1) ∑ j|i f(j) (可以理解為,每個j都會被算x次,j*x<=n且x最大)

=∑(n,j=1) ⌊n/j⌋ f(j) (求得x為n/j)

=∑(n,j=1) f(⌊n/j⌋) (列舉乘數x,可以滿足n/x中每個j,故加上它的字首和)

∴f(n)=g(n)−∑n/i=2f(⌊n/i⌋)

這樣我們將求f(n)的過程分開了。

我們線性篩出前n^(2/3)個f(n),後面的用前面的得出並使用map記憶化即可。

#includeusing namespace std;

const int maxx = 10000001 * 2;

bool isprime[maxx];

int prime[maxx/10];

int mu[maxx];

int countp;

mapmp;

void get_mu(int maxn)

else mu[t] = -mu[i];

}}}long long n,m;

long long nn,top;

long long ans;

int get(long long x)

int main()

51 NOD 1244 莫比烏斯函式之和 杜教篩

1244 莫比烏斯函式之和 基準時間限制 3 秒 空間限制 131072 kb 分值 320 難度 7級演算法題 收藏 關注 莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯 mertens 首先使用 n miu n 作為莫比烏斯函式的記號。具體定義如下 如果乙個數包含平方因子,那麼miu ...

51nod1244 莫比烏斯函式和 杜教篩

求 n i 1 i n 1010 有一篇文必須得轉 author skywalkert original article last update time 2017 04 01 推一波式子 下面的除法都是整除 由 ni 1 d i d 1可推 n i 1 nij 1 j 等價 於列舉a ij,給a累...

51NOD 1244 莫比烏斯函式之和(杜教篩)

題目鏈結 分析 首先,我們提出乙個關於mu函式的簡單性質 即 這樣,我們就可以像1239一樣 預處理出一部分的s函式,之後的s值用hash 記搜解決 mu 1 1不要忘了 include include include define ll long long using namespace std ...