hdu 5468 莫比烏斯 搜尋

2021-07-06 08:19:48 字數 1382 閱讀 9719

hdu 5468 puzzled elena   /*快速通道*/

sample input

5

1 21 3

2 42 5

6 2 3 4 5

sample output

case #1: 1 1 0 0 0 

題意:在一棵樹上,每個節點有值,求以x為根節點的樹中,有多少與根節點互質

思路:用num[i]記錄節點中包含因子

i的個數,然後搜尋到當前根節點時,我們先記錄下在此之前的num,然後遍歷返回後,

計算num的差值,利用莫比烏斯原理,先ans記錄樹中所有的節點數,然後該加的加,該減的減。

莫比烏斯不清楚的話可以翻翻前面的文章。

aoqnrmgyxlmv

tc_to_top

/*如果互質,找出子樹中包含val[cur]的因子的數,假設為6,則減去約數中含有2,3的

但是會重複減去含有6的,所以應該在加上含6的數

於是滿足了莫比烏斯函式,合數為0,含奇數個質數為-1,含偶數個質數為1

感覺特別適合容斥原理。

對於dfs序:/*並不了解,也可以做的

將樹展現在陣列上。

void dfs(int u, int fa)

dfn ++;

seq[dfn] = -u;

}參考:

aoqnrmgyxlmv:

tc_to_top:

*/#include #include #include #include #include #include #include #include typedef long long ll;

using namespace std;

const int inf = 0x3f3f3f3f;

const int maxn = 100000;

int is_prime[maxn+10];

int prime[maxn+10];

int mu[maxn+10];

int snum[maxn+10];

vecto***c[maxn + 10];

vectorf[maxn+10];

int tot;

void moblus()

for(int j = 0; j < tot; j++)

else}}

for(int i = 2; i <= maxn; i++)

}int val[maxn],num[maxn],ans[maxn];

void dfs(int cur,int par)

{ snum[cur] = 1;

vectortt;

for(int i = 0; i

莫比烏斯函式與莫比烏斯反演

1.1 莫比烏斯函式 莫比烏斯函式可以看做乙個輔助函式,它在莫比烏斯反演公式中用到。1.2 莫比烏斯反演 莫比烏斯反演公式是 根據和函式來求算數函式的乙個公式。1.3 算數函式 所有在正整數上運算的函式稱為算數函式。1.4 和函式 設 f 是算數函式,f 的和函式為n的所有約數的算數函式之和。1.5...

hdu5072 莫比烏斯

給出n個數,問其中有多少三元組 a,b,c 使得 a,b b,c a,c 1 or a,b 1 and a,c 1 and b,c 1 n 10 5,ai 10 5.首先可以把問題抽象為有n個點,兩兩連邊,有紅邊和藍邊,問三邊同色三角形有多少。然後考慮算反面,發現只要找從乙個點出發的兩種邊分別有幾條...

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

首先設兩個任意函式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 ...