Link
Luogu - https://www.luogu.org/problemnew/show/P4619
BZOJ - https://www.lydsy.com/JudgeOnline/problem.php?id=5332


Description
TTT 组询问。每一组给出 1≤A,B,C≤1051\le A,B,C\le10^51≤A,B,C≤105 求:
∑i=1A∑j=1B∑k=1Cd(ijk)mod  109+7\sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^Cd(ijk)\mod{10^9+7}i=1∑A​j=1∑B​k=1∑C​d(ijk)mod109+7
满足 1≤∑max⁡(A,B,C)≤2×1051\le\sum\max(A,B,C)\le2\times10^51≤∑max(A,B,C)≤2×105 。


∑i=1A∑j=1B∑k=1Cd(ijk)=∑i=1A∑j=1B∑k=1C[(i,j)=1][(j,k)=1][(k,i)=1]⌊Ai⌋⌊Bj⌋⌊Ck⌋=∑i=1A∑j=1B∑k=1C∑a∣(i,j)μ(a)∑b∣(j,k)μ(b)∑c∣(k,i)μ(c)⌊Ai⌋⌊Bj⌋⌊Ck⌋\begin{array}{rcl} &&\sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^Cd(ijk)\\ &=&\sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^C[(i,j)=1][(j,k)=1][(k,i)=1]\lfloor\frac{A}{i}\rfloor\lfloor\frac{B}{j}\rfloor\lfloor\frac{C}{k}\rfloor\\ &=&\sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^C\sum\limits_{a|(i,j)}\mu(a)\sum\limits_{b|(j,k)}\mu(b)\sum\limits_{c|(k,i)}\mu(c)\lfloor\frac{A}{i}\rfloor\lfloor\frac{B}{j}\rfloor\lfloor\frac{C}{k}\rfloor\\ \end{array}​==​i=1∑A​j=1∑B​k=1∑C​d(ijk)i=1∑A​j=1∑B​k=1∑C​[(i,j)=1][(j,k)=1][(k,i)=1]⌊iA​⌋⌊jB​⌋⌊kC​⌋i=1∑A​j=1∑B​k=1∑C​a∣(i,j)∑​μ(a)b∣(j,k)∑​μ(b)c∣(k,i)∑​μ(c)⌊iA​⌋⌊jB​⌋⌊kC​⌋​
但是这个时候你不好继续按照 Number Challenge 的方法推,
而且上面那条式子你也不好化开。那怎么办呢?
回退一层
∑i=1A∑j=1B∑k=1C[(i,j)=1][(j,k)=1][(k,i)=1]⌊Ai⌋⌊Bj⌋⌊Ck⌋\sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^C[(i,j)=1][(j,k)=1][(k,i)=1]\left\lfloor\frac{A}{i}\right\rfloor\left\lfloor\frac{B}{j}\right\rfloor\left\lfloor\frac{C}{k}\right\rfloori=1∑A​j=1∑B​k=1∑C​[(i,j)=1][(j,k)=1][(k,i)=1]⌊iA​⌋⌊jB​⌋⌊kC​⌋
你康到了什么?
实际上在推的时候就应该注意到的。(i,j)(j,k)(k,i)(i,j)(j,k)(k,i)(i,j)(j,k)(k,i) 显然是一个三元环的形式
我们把互质的数两两连边,然后做三元环计数,每个三元环 (i,j,k)(i,j,k)(i,j,k) 的贡献是
(⌊Ai⌋+⌊Bi⌋+⌊Ci⌋)+(⌊Aj⌋+⌊Bj⌋+⌊Cj⌋)+(⌊Ak⌋+⌊Bk⌋+⌊Ck⌋)\left(\left\lfloor\frac{A}{i}\right\rfloor+\left\lfloor\frac{B}{i}\right\rfloor+\left\lfloor\frac{C}{i}\right\rfloor\right)+\left(\left\lfloor\frac{A}{j}\right\rfloor+\left\lfloor\frac{B}{j}\right\rfloor+\left\lfloor\frac{C}{j}\right\rfloor\right)+\left(\left\lfloor\frac{A}{k}\right\rfloor+\left\lfloor\frac{B}{k}\right\rfloor+\left\lfloor\frac{C}{k}\right\rfloor\right)(⌊iA​⌋+⌊iB​⌋+⌊iC​⌋)+(⌊jA​⌋+⌊jB​⌋+⌊jC​⌋)+(⌊kA​⌋+⌊kB​⌋+⌊kC​⌋)
但是问题就来了:数最多有 2×1052\times10^52×105 个,把互质的数两两连边的话就有好多好多个边
好多个边边
是吗
真的吗
复杂度的问题不能傻逼估计 你想想啊
n(n−1)2ln⁡2n\frac{n(n-1)}{2\ln^2 n}2ln2nn(n−1)​
震 惊 好大啊 完了 那还真的跑卜过去
那怎么办啊?
说明我们这个力度不够 要加大力度
搞成什么呢 反演啊 搞个约数出来啊 d2(n)d^2(n)d2(n) 总没有问题吧 能 ω2(n)\omega^2(n)ω2(n) 就更美滋滋啦
不要放弃治疗 结果还是得硬化嘛
∑i=1A∑j=1B∑k=1C[(i,j)=1][(j,k)=1][(k,i)=1]⌊Ai⌋⌊Bj⌋⌊Ck⌋\sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^C[(i,j)=1][(j,k)=1][(k,i)=1]\left\lfloor\frac{A}{i}\right\rfloor\left\lfloor\frac{B}{j}\right\rfloor\left\lfloor\frac{C}{k}\right\rfloori=1∑A​j=1∑B​k=1∑C​[(i,j)=1][(j,k)=1][(k,i)=1]⌊iA​⌋⌊jB​⌋⌊kC​⌋
∑i=1A∑j=1B∑k=1C⌊Ai⌋⌊Bj⌋⌊Ck⌋∑u∣(i,j)∑v∣(j,k)∑w∣(k,i)μ(u)μ(v)μ(w)\sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^C\left\lfloor\frac{A}{i}\right\rfloor\left\lfloor\frac{B}{j}\right\rfloor\left\lfloor\frac{C}{k}\right\rfloor\sum\limits_{u|(i,j)}\sum\limits_{v|(j,k)}\sum\limits_{w|(k,i)}\mu(u)\mu(v)\mu(w)i=1∑A​j=1∑B​k=1∑C​⌊iA​⌋⌊jB​⌋⌊kC​⌋u∣(i,j)∑​v∣(j,k)∑​w∣(k,i)∑​μ(u)μ(v)μ(w)
∑u=1min⁡(A,B)∑v=1min⁡(B,C)∑w=1min⁡(C,A)μ(u)μ(v)μ(w)∑u∣i&v∣i∑v∣j&w∣j∑w∣k&u∣k⌊Ai⌋⌊Bj⌋⌊Ck⌋\sum\limits_{u=1}^{\min(A,B)}\sum\limits_{v=1}^{\min(B,C)}\sum\limits_{w=1}^{\min(C,A)}\mu(u)\mu(v)\mu(w)\sum\limits_{u|i\&v|i}\sum\limits_{v|j\&w|j}\sum\limits_{w|k\&u|k}\left\lfloor\frac{A}{i}\right\rfloor\left\lfloor\frac{B}{j}\right\rfloor\left\lfloor\frac{C}{k}\right\rflooru=1∑min(A,B)​v=1∑min(B,C)​w=1∑min(C,A)​μ(u)μ(v)μ(w)u∣i&v∣i∑​v∣j&w∣j∑​w∣k&u∣k∑​⌊iA​⌋⌊jB​⌋⌊kC​⌋
∑u=1min⁡(A,B)∑v=1min⁡(B,C)∑w=1min⁡(C,A)μ(u)μ(v)μ(w)∑[u,v]∣i⌊Ai⌋∑[v,w]∣j⌊Bj⌋∑[w,u]∣k⌊Ck⌋\sum\limits_{u=1}^{\min(A,B)}\sum\limits_{v=1}^{\min(B,C)}\sum\limits_{w=1}^{\min(C,A)}\mu(u)\mu(v)\mu(w)\sum\limits_{[u,v]|i}\left\lfloor\frac{A}{i}\right\rfloor\sum\limits_{[v,w]|j}\left\lfloor\frac{B}{j}\right\rfloor\sum\limits_{[w,u]|k}\left\lfloor\frac{C}{k}\right\rflooru=1∑min(A,B)​v=1∑min(B,C)​w=1∑min(C,A)​μ(u)μ(v)μ(w)[u,v]∣i∑​⌊iA​⌋[v,w]∣j∑​⌊jB​⌋[w,u]∣k∑​⌊kC​⌋
后面三个当然可以预处理辣 设为 f(x,y)=∑y∣i⌊xi⌋f(x,y)=\sum\limits_{y|i}\left\lfloor\frac{x}{i}\right\rfloorf(x,y)=y∣i∑​⌊ix​⌋ 只需要处理 x=A,  x=B,  x=Cx=A,\;x=B,\;x=Cx=A,x=B,x=C 的情况。
∑u=1min⁡(A,B)∑v=1min⁡(B,C)∑w=1min⁡(C,A)μ(u)μ(v)μ(w)f(A,[u,v])f(B,[v,w])f(C,[w,u])\sum\limits_{u=1}^{\min(A,B)}\sum\limits_{v=1}^{\min(B,C)}\sum\limits_{w=1}^{\min(C,A)}\mu(u)\mu(v)\mu(w)f(A,[u,v])f(B,[v,w])f(C,[w,u])u=1∑min(A,B)​v=1∑min(B,C)​w=1∑min(C,A)​μ(u)μ(v)μ(w)f(A,[u,v])f(B,[v,w])f(C,[w,u])
熟悉的样子
对于 (u,v,w)(u,v,w)(u,v,w) 三元环,边是 f()f()f() 点是 μ\muμ
μ=0\mu=0μ=0 的点不应存在。
而且:两点有边当且仅当 f(,[])≠0f(,[])\ne0f(,[])̸​=0 也就是说,比如 (u,v)(u,v)(u,v) 应该有 [u,v]≤min⁡(A,B,C)[u,v]\le\min(A,B,C)[u,v]≤min(A,B,C) 才能连边
对于这样的两点我们连一条边,边权为 lcmlcmlcm 方便到时候算 fff

建边怎么做呢?首先你要知道 max⁡(A,B,C)\max(A,B,C)max(A,B,C) 以内所有数的质因子 这个要埃筛
直接枚举两个数连边肯定会炸,所以先枚举 uuu 再枚举子集 (u,v)(u,v)(u,v) 最后直接得到 vvv
或者枚举 gcdgcdgcd 然后搞出 uuu 和 vvv
(实际上暴枚判断mu gcd然后continue也可以,而且不用埃筛(线性筛即可)。不过常数可能有、、、大)
(大就大吧,好写啊。。)
复杂度 O(卡过)O(卡过)O(卡过)
O(卡过)&lt;&lt;O(∑n=1max⁡(A,B,C)3ω(n))O(卡过)&lt;&lt;O\left(\sum\limits_{n=1}^{\max(A,B,C)}3^{\omega(n)}\right)O(卡过)<<O(n=1∑max(A,B,C)​3ω(n))

然后对于每次询问就三元环计数。边定向+暴枚 O(mm)O(m\sqrt{m})O(mm​)
emm 关于 mmm 的大小嘛 有一个非常松的上界 (729×105)(729\times10^5)(729×105) 实际上实践一下就发现挺少的
7×1057\times10^57×105 级别。然后大概大概可以过。


好啊 有没有发现 很卡常数嘛 你还要处理各种细节 比如两个/三个点重复的情况需要额外算。。


谁能告诉我为啥我的 vectorO2 反而变慢了,,,

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<vector>
#include<algorithm>
using namespace std;
#define R register
const int MOD = 1e9 + 7;
const int MAXN = 1e5 + 5;
const int MAXA = 1e5;
int T, A, B, C, Mx, Mn, PrimeList[MAXN], Mu[MAXN], Deg[MAXN], Mark[MAXN], Stray[MAXN];
long long Fa[MAXN], Fb[MAXN], Fc[MAXN], Ans;
bool NotPrime[MAXN];
struct Minimal
{int v, w;Minimal(const int& vv = 0, const int& ww = 0) { v = vv, w = ww;}
};
vector<Minimal>e[MAXN];
int tot;
struct St
{int u, v, w;St(const int& uu = 0, const int& vv = 0, const int& ww = 0) { u = uu; v = vv; w = ww;}
}Edg[800005];
int gcd(const int& a, const int& b)
{return !b?a:gcd(b,a%b);
}
long long Calc(const int& a, const int& b, const int& c)
{return Fa[a] * Fb[b] * Fc[c] +Fa[a] * Fb[c] * Fc[b] +Fa[b] * Fb[a] * Fc[c] +Fa[b] * Fb[c] * Fc[a] +Fa[c] * Fb[a] * Fc[b] +Fa[c] * Fb[b] * Fc[a] ;
}
int main()
{NotPrime[0] = NotPrime[1] = 1; Mu[1] = 1;for (R int t, i = 2; i <= MAXA; ++i){if (!NotPrime[i]) PrimeList[++PrimeList[0]] = i, Mu[i] = -1;for (R int j = 1; j <= PrimeList[0] && (t = i * PrimeList[j]) <= MAXA; ++j){NotPrime[t] = 1;if (!(i % PrimeList[j])) break;Mu[t] = -Mu[i];}}scanf("%d", &T);R long long f;while (T--){scanf("%d%d%d", &A, &B, &C); Mx = max(max(A, B), C); Mn = min(min(A, B), C); tot = Ans = 0;fill(Fa, Fa + Mx + 1, 0); fill(Fb, Fb + Mx + 1, 0); fill(Fc, Fc + Mx + 1, 0);fill(Deg, Deg + Mx + 1, 0); fill(Mark, Mark + Mx + 1, 0);for (R int i = 1; i <= Mx; ++i) e[i].clear();for (R int i = 1; i <= A; ++i) for (R int j = i; j <= A; j += i) Fa[i] += A / j;for (R int i = 1; i <= B; ++i) for (R int j = i; j <= B; j += i) Fb[i] += B / j;for (R int i = 1; i <= C; ++i) for (R int j = i; j <= C; j += i) Fc[i] += C / j;for (R int i = 1; i <= Mn; ++i) Ans += Mu[i] * Fa[i] * Fb[i] * Fc[i];for (R int x, i = 1; i <= Mx; ++i){if (!Mu[i]) continue;for (R int j = 1, t = i; t <= Mx; ++j, t += i){if (!Mu[t]) continue;f = 1ll * t * (j + 1);for (R int k = j + 1; f <= 1ll * Mx; ++k, f += t){if (!Mu[x = i * k]) continue;if (j == 1 || k == 1 || gcd(j, k) == 1){Ans += Mu[x] * (Fa[t] * Fb[f] * Fc[f] + Fa[f] * Fb[t] * Fc[f] + Fa[f] * Fb[f] * Fc[t]);Ans += Mu[t] * (Fa[x] * Fb[f] * Fc[f] + Fa[f] * Fb[x] * Fc[f] + Fa[f] * Fb[f] * Fc[x]);++Deg[x], ++Deg[t]; Edg[++tot] = St(t, x, f);}}}}for (R int i = 1; i <= tot; ++i){R int &u = Edg[i].u, &v = Edg[i].v;if (Deg[u] > Deg[v] || (Deg[u] == Deg[v] && u < v)) e[u].push_back(Minimal(v, Edg[i].w));else e[v].push_back(Minimal(u, Edg[i].w));}for (R int tt, i = 1; i <= Mx; ++i){tt = e[i].size();for (R int j = 0; j < tt; ++j) Mark[e[i][j].v] = i, Stray[e[i][j].v] = e[i][j].w;for (R int kksk, u, v, j = 0; j < tt; ++j){u = e[i][j].v; kksk = e[u].size();for (R int k = 0; k < kksk; ++k){v = e[u][k].v;if (Mark[v] == i) Ans += Calc(Stray[v], e[i][j].w, e[u][k].w) * Mu[i] * Mu[u] * Mu[v];}}}printf("%lld\n", Ans % MOD);}return 0;
}

[BZOJ5332] [SDOI2018] 旧试题 [BZOJ5276] Skyfall [莫比乌斯反演][三元环计数][std::vector][Cache Miss]相关推荐

  1. P4619 [SDOI2018]旧试题(莫比乌斯反演,建图优化三重枚举,三元环计数,神仙好题,超级清晰易懂)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4619 [SDOI2018]旧试题(莫比乌斯反演,三元环计数) Problem 计算: ∑i=1A ...

  2. P4619 [SDOI2018]旧试题

    P4619 [SDOI2018]旧试题 题意: 求个式子: (∑i=1A∑j=1B∑k=1Cd(i∗j∗k))mod(109+7)(\sum_{i=1}^{A}\sum_{j=1}^{B}\sum_{ ...

  3. [SDOI2018] 旧试题

    推狮子的部分 \[ \sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sigma(ijk) =\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sum_ ...

  4. [SDOI2018]旧试题 题解

    传送门 简单反演+神仙优化题. 首先我们知道 σ0(xy)=∑i∣x∑j∣y[(i,j)=1]\sigma_0(xy)=\sum\limits_{i|x}\sum\limits_{j|y}[(i,j) ...

  5. 牛客挑战赛51 E NIT的gcd(欧拉反演,建图优化,三元环计数)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 给你一个正整数 nnn. 请你输出 ∑i=1n∑j=1n∑k=1ngcd⁡(i,j)g ...

  6. [bzoj 5332][SDOI2018]旧试题

    传送门 Description \[ \sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^Cd(ijk) (\mathrm{mod\:} 10^9+7) \] 其中 \(d(ijk) ...

  7. BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=5330 (Luogu) https://www.luogu.org/prob ...

  8. 【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛

    题目描述 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i<=N" ...

  9. 【Project Euler】530 GCD of Divisors 莫比乌斯反演

    [题目]GCD of Divisors [题意]给定f(n)=Σd|n gcd(d,n/d)的前缀和F(n),n=10^15. [算法]莫比乌斯反演 [题解]参考:任之洲数论函数.pdf 这个范围显然 ...

  10. 狄利克雷卷积莫比乌斯反演证明

    狄利克雷卷积简介 卷积这名字听起来挺学究的,今天学了之后发现其实挺朴实hhh. 卷积: "(n)"表示到n的一个范围. 设\(f,g\)是两个数论函数(也就是说,以自然数集为定义域 ...

最新文章

  1. 打家劫舍—leetcode198
  2. eclipse查看git地址_使用Git进行版本控制
  3. Dockerfile 文件结构、docker镜像构建过程详细介绍
  4. vb红绿灯自动切换_VB红绿灯程序.doc
  5. c语言c 的区别,C语言与C++的区别
  6. mysql存储过程灌数据_【mysql实战】存储过程灌入一百万数据
  7. kali linux 自动登录,Kali Linux SSH登录故障处理
  8. 记一次悲惨的excel导出事件
  9. 23种设计模式之工厂模式
  10. uniapp 集成腾讯云超级播放器问题
  11. (转)iPhone +ipad尺寸规范(界面 图标)
  12. Netty的深入浅出--79.Netty官方Reference Counted Objects文档说明
  13. 周易六十四卦——雷火丰卦
  14. 谷歌浏览器翻译修复工具
  15. SAP英语专栏:第1篇
  16. 面向对象程序设计c++版董正言张聪课本课后习题答案第三章
  17. 哭得累了   矛盾心里总是强求   劝自己要放手   闭上眼让你走
  18. 对于通用计算机而言,MIT论文:通用计算机时代即将终结
  19. java none怎么用tomcat_关于如何在Tomcat中使用JavaBean
  20. js添加多个子节点_javascript如何创建子节点

热门文章

  1. 嵌入式Linux——学习经历
  2. mysql如何成祖_明成祖朱棣原是藩王,成为皇帝以后是如何解决的藩王问题?
  3. 设置网页浏览器标签小图标
  4. xctf攻防世界 MISC高手进阶区 2-1
  5. hp服务器时间修改,HP服务器bios时间设置确认
  6. 计算机网络拨号,个人拨号上网宽带连接设置图文方法
  7. 牛客赛47 DongDong认亲戚(并查集+map)
  8. C++ 单例模式-打印机案例
  9. 深入Tensorflow Embedding,解决Tensorboard无法显示PROJECTOR问题
  10. 2019JAVA面试题精粹附答案