hdu4676 麥比烏斯反演 分塊

2021-06-17 23:46:00 字數 710 閱讀 5120

解題思路:總體上這是乙個數學題加上離線與分塊處理加速。顯然對於區間內有公約數x的數來說,假設有num[x]個x的倍數,那麼答案顯然是sigma(c(num[x],2)*f(x)),根據容斥原理f(x)應該是乙個小於x的數並且滿足sigma(f(d)) = x,因為有x這個約數的數對一定也有d這個約數,其中d|x,所以我在加上c(num[x],2)*f(x)之前就把c(num[d],2)*f(d)加上了,而總共對於x所需累加的次數是x,所以有sigma(f(d)) = x,而這正是麥比烏斯反演公式,可得f(d)為尤拉函式,

然後每加入乙個數我們只要加上num[x]*phi[x]就行了(根據組合公式的性質比較容易看出)。但是直接暴力的話複雜度會超,就是對於查詢區間大幅波動的情況就需要不停的加入點,刪除點,複雜度估計能達到n平方,所以我們採用離線查詢的方式,然後對查詢左端點分段排,在每一段內保證查詢右端點的有序性,這樣就可以大致保持查詢左端點和右端點的有序性。下面上**:

#include#include#include#include#include#include#define n 20005

using namespace std;

int phi[n],a[n],num[n],ans[n];

int l,r,ret;

vectord[n];

struct node

seg[n];

void init()

{ for(int i = 1;i

莫比烏斯反演 二 莫比烏斯反演定理

首先設兩個任意函式f x 和f x 定義運算 f x sum f d 這時就可以用f x 表示f x f 1 f 1 f 2 f 1 f 2 f 3 f 3 f 1 f 4 f 4 f 2 f 1 f 5 f 5 f 1 f 6 f 6 f 3 f 2 f 1 這時可以試著用f x 表示f x f ...

莫比烏斯反演

首先 莫比烏斯函式有個性質 d n d 1 n 1 0 n 1 證明 n 1時,不做多餘說明。n 1 根據唯一分解定理,可以分解n ki 1pai i 對於那些含平方因子也就是存在ai 不為1的數,它的函式值為0,對答案沒有任何貢獻。所以我們來看看那些是互異素數乘積的數,每乙個成為它約數的數是什麼樣...

莫比烏斯反演

定理 f n 和f n 是定義在非負整數集合上的兩個函式,並且滿足條件f n d nf d 那麼我們得到結論f n d n d f n d 在上面的公式中有乙個函式 d 它的定義如下 1 若d 1,那麼 d 1 2 若d p1 p2 p k 均為互異素數,那麼 d 1 k 3 其它情況下 d 0 對...