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