hdu 5468 puzzled elena /*快速通道*/
sample input
51 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 ...