SDOI2018 舊試題(莫比烏斯反演+三元環計數)
題目大意
求:
其中為的因數個數。
題解
居然真的會有這麼美妙的結論qwq……
感性理解一下就是,每個質因數分開考慮。假設它在中的指數分別為,那麼它總共會在上面的算式中出現恰好次。由於所有質數貢獻獨立,因此上面的算式就等於因數個數。
暴力帶入原式並使用莫比烏斯反演,可以得到:
其中。
考慮全都不相等的情況。我們可以建無向圖,對於任意的,連邊。然後找圖中的三元環,並任意輪換3!次加入答案。
如果中恰好有一對相等,則可以任意輪換3次計入答案。
如果全部相等,直接迴圈列舉即可。
三元環計數在本題中似乎暴力就能過(大霧)。
#include <bits/stdc++.h>
namespace IOStream {
const int MAXR = 1 << 23;
char _READ_[MAXR], _PRINT_[MAXR];
int _READ_POS_, _PRINT_POS_, _READ_LEN_;
inline char readc() {
#ifndef ONLINE_JUDGE
return getchar();
#endif
if (!_READ_POS_) _READ_LEN_ = fread(_READ_, 1, MAXR, stdin);
char c = _READ_[_READ_POS_++];
if (_READ_POS_ == MAXR) _READ_POS_ = 0;
if (_READ_POS_ > _READ_LEN_) return 0;
return c;
}
template<typename T> inline void read(T &x) {
x = 0; register int flag = 1, c;
while (((c = readc()) < '0' || c > '9') && c != '-');
if (c == '-') flag = -1; else x = c - '0';
while ((c = readc()) >= '0' && c <= '9') x = x * 10 + c - '0';
x *= flag;
}
template<typename T1, typename ...T2> inline void read(T1 &a, T2 &...x) {
read(a), read(x...);
}
inline int reads(char *s) {
register int len = 0, c;
while (isspace(c = readc()) || !c);
s[len++] = c;
while (!isspace(c = readc()) && c) s[len++] = c;
s[len] = 0;
return len;
}
inline void ioflush() {
fwrite(_PRINT_, 1, _PRINT_POS_, stdout), _PRINT_POS_ = 0;
fflush(stdout);
}
inline void printc(char c) {
_PRINT_[_PRINT_POS_++] = c;
if (_PRINT_POS_ == MAXR) ioflush();
}
inline void prints(char *s) {
for (int i = 0; s[i]; i++) printc(s[i]);
}
template<typename T> inline void print(T x, char c = '\n') {
if (x < 0) printc('-'), x = -x;
if (x) {
static char sta[20];
register int tp = 0;
for (; x; x /= 10) sta[tp++] = x % 10 + '0';
while (tp > 0) printc(sta[--tp]);
} else printc('0');
printc(c);
}
template<typename T1, typename ...T2> inline void print(T1 x, T2... y) {
print(x, ' '), print(y...);
}
}
using namespace IOStream;
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
#define cls(a) memset(a, 0, sizeof(a))
const int MAXN = 100005, MOD = 1000000007;
int mu[MAXN], prime[MAXN], vis[MAXN], A, B, C = 100000, T;
ll d[MAXN], da[MAXN], db[MAXN], dc[MAXN];
vector<P> g[MAXN];
int main() {
mu[1] = 1;
for (int i = 2, cnt = 0; i <= C; i++) {
if (!vis[i]) mu[prime[++cnt] = i] = -1;
for (int j = 1; j <= cnt; j++) {
int p = prime[j], q = i * p;
if (q > C) break;
vis[q] = 1;
if (i % p == 0) break;
mu[q] = -mu[i];
}
}
for (int i = 1; i <= C; i++) {
for (int j = i; j <= C; j += i) ++d[j];
d[i] += d[i - 1];
}
for (scanf("%d", &T); T--;) {
scanf("%d%d%d", &A, &B, &C);
cls(vis);
if (A > B) swap(A, B);
if (A > C) swap(A, C);
if (B > C) swap(B, C);
for (int i = 1; i <= C; i++) {
da[i] = d[A / i];
db[i] = d[B / i];
dc[i] = d[C / i];
g[i].clear();
}
ll ans = 0;
for (int i = 1; i <= C; i++) {
for (int j = 1; j * i <= C; j++) {
for (int k = j + 1; (ll)i * j * k <= C; k++) {
int a = i * j, b = i * k, c = i * j * k;
if (!mu[a] || !mu[b] || __gcd(j, k) > 1) continue;
ans += mu[a] * mu[a] * mu[b] * (
da[c] * db[c] * dc[a] +
da[c] * db[a] * dc[c] +
da[a] * db[c] * dc[c] );
ans += mu[a] * mu[b] * mu[b] * (
da[b] * db[c] * dc[c] +
da[c] * db[b] * dc[c] +
da[c] * db[c] * dc[b] );
g[a].push_back(P(b, c));
}
}
ans += mu[i] * mu[i] * mu[i] * da[i] * db[i] * dc[i];
}
for (int i = 1; i <= C; i++) if (mu[i]) {
for (P j : g[i]) vis[j.first] = i, prime[j.first] = j.second;
for (P j : g[i]) if (j.first > i && mu[j.first]) {
int a = j.second;
for (P k : g[j.first]) if (k.first > j.first && vis[k.first] == i && mu[k.first]) {
int b = k.second, c = prime[k.first];
ans += mu[i] * mu[j.first] * mu[k.first] * (
da[a] * db[b] * dc[c] +
da[a] * db[c] * dc[b] +
da[b] * db[a] * dc[c] +
da[b] * db[c] * dc[a] +
da[c] * db[a] * dc[b] +
da[c] * db[b] * dc[a] );
}
}
}
printf("%lld\n", (ans % MOD + MOD) % MOD);
}
return 0;
}
相關文章
- 莫比烏斯反演
- SDOI2018 反迴文串(莫比烏斯反演+Pollard-Rho)
- 比較典的莫比烏斯反演
- Hackerrank GCD Product(莫比烏斯反演)GC
- 莫比烏斯反演學習筆記筆記
- Problem H. Curious (莫比烏斯反演)
- 演算法隨筆——數論之莫比烏斯反演演算法
- 狄利克雷卷積 & 莫比烏斯反演卷積
- 狄利克雷卷積與莫比烏斯反演卷積
- 莫比烏斯
- 洛谷 P2257 YY的GCD(莫比烏斯反演)GC
- cf900D. Unusual Sequences(容斥 莫比烏斯反演)
- 莫比烏斯函式函式
- 莫比烏斯函式 - 學習筆記函式筆記
- P1989 無向圖三元環計數
- SDOI2018:原題識別
- SDOI2018 原題識別(主席樹)
- mysql 求分組中位數、環比、同比、中位數的環比、同比MySql
- BZOJ2839/LG10596 集合計數 題解(二項式反演+擴充套件尤拉定理)套件
- 數木莫系且的旭醬買水問題
- 2018世界盃烏拉圭vs俄羅斯誰會贏 烏拉圭vs俄羅斯比分預測
- 函數語言程式設計嘗試之俄羅斯方塊函數程式設計
- 猿人學web端爬蟲攻防大賽賽題第19題——烏拉烏拉烏拉Web爬蟲
- LeetCode題解(1534):統計陣列中滿足指定條件的三元組數量(Python)LeetCode陣列Python
- 薩繆爾·莫爾斯:電報之父的傳奇人生
- 《漫威蜘蛛俠:邁爾斯·莫拉萊斯》IGN評測:擺盪到新高度
- Ignatius and the Princess IV——伊格納提烏斯和四公主
- Hive之同比環比的計算Hive
- 人工智慧原理期末速成——消解反演與反演求解人工智慧
- 各語言中的三元運算子與 golang 對比Golang
- SDOI2018:榮譽稱號
- 微軟稱俄羅斯對烏克蘭發動了數百次網路攻擊微軟
- 關於Mobius反演
- 蒙莫斯大學研究報告:假新聞正在威脅媒體
- 莫隊的 1.5 近似構造 題解
- 【程式設計測試題】素數對、不要二、求和程式設計
- 數學趣題:比較大小(二)
- MutableLiveData 舊資料問題LiveData