hdu5072 莫比烏斯

2021-06-27 13:39:06 字數 897 閱讀 2806

給出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個點,兩兩連邊,有紅邊和藍邊,問三邊同色三角形有多少。

然後考慮算反面,發現只要找從乙個點出發的兩種邊分別有幾條並相乘,加起來除二即可。

所以只用算與ai互質的有幾個。發現ai <= 10^5。這樣只需變為陣列b,記錄乙個元素出現幾次,再用容斥做即可。

容斥:列舉x,num[x] = sigma(x | d, b[d]), c[d] += -mu[x] * num[x]。c陣列為與它不互質個數。

#include #include #include #include #include #include #define rep(i, x, y) for (int i = x; i <= y; i ++)

#define repe(i, x) for (int i = pos[x]; i; i = g[i].nex)

using namespace std;

typedef long long ll;

const int l = 100000, n = l + 5;

int n, a[n], u[n], pri[n], pz, t;

bool c[n];

ll ans, tot, b[n];

void pre()

} }}int main()

ans = ll(n) * (n-1) * (n-2) / 6;

rep(i, 2, l) b[i] -= a[i];

// rep(i, 1, 10) cout << a[i]<<" "<

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

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

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

首先設兩個任意函式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,對答案沒有任何貢獻。所以我們來看看那些是互異素數乘積的數,每乙個成為它約數的數是什麼樣...