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 ...