传送门

Description

\[ \sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^Cd(ijk) (\mathrm{mod\:} 10^9+7) \]

其中 \(d(ijk)\) 表示 \(i × j × k\)的约数个数。

Solution

首先,有一个公式
\[ σ_0(n_1n_2···n_m) =\sum_{a_1|n_1}\sum_{a_2|n_2}···\sum_{a_m|n_m}\prod_{1≤i \neq j≤m} [a_i ⊥ a_j] \]
所以,我们就可以把答案反演成:
\[ \sum_{u=1}^{M}\sum_{v=1}^{M}\sum_{w=1}^{M}\mu(u)\mu(v)\mu(w)\left ( \sum_{lcm(u,v)|x}\frac{A}{x} \right )\left ( \sum_{lcm(v,w)|y}\frac{B}{y} \right )\left ( \sum_{lcm(u,w)|z}\frac{C}{z} \right ) \]
其中,\(M=max\{ A,B,C\}\)

我们发现,根据调和级数,可以求出后面的那些都可以通过\(O(n\log n)\)预处理出来

我们先直接计算\(u=v=w\)以及\(u,v,w\)中恰有两个数相等的情况

然后剩下的就是\(u,v,w\)互不相同的了,我们把\(lcm(u,v)\leq M\)的\(u,v\)连边,这样,其实就是求所有三元环的贡献啦。

关于求三元环呢,这里有个不常用的黑科技,参见这里,可以使得复杂度为\(O(m\sqrt m)\)

其实图的边数是比较少的,所以目测能过

据说用\(vector\)要比较快?

Code

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 200005
#define mN 100005
#define mod 1000000007
int mu[mN],pr[mN/10],tot;bool mark[mN];
int gcd(int x,int y){return y?gcd(y,x%y):x;}
inline void init_mu()
{mu[1]=1;register int i,j;for(i=2;i<mN;++i){if(!mark[i]){pr[++tot]=i;mu[i]=-1;}for(j=1;j<=tot&&pr[j]*i<mN;++j){mark[pr[j]*i]=true;if(i%pr[j]) mu[pr[j]*i]=-mu[i];else{mu[pr[j]*i]=0;break;}}}
}
int T,A,B,C,N,M;
ll fa[MN],fb[MN],fc[MN],ans;
struct edge{int to,lcm;};
struct Edge{int f,t,lcm;}e[MN<<4];int en;
std::vector<edge> G[mN];
int d[mN],mrk[mN];
inline void init()
{register int i,j;N=max(A,max(B,C));M=min(A,min(B,C));memset(d,0,sizeof d);en=0;for(i=1;i<=N;++i)G[i].clear();ans=0;memset(fa,0,sizeof fa);memset(fb,0,sizeof fb);memset(fc,0,sizeof fc);for(i=1;i<=A;++i) for(j=i;j<=A;j+=i) fa[i]+=A/j;for(i=1;i<=B;++i) for(j=i;j<=B;j+=i) fb[i]+=B/j;for(i=1;i<=C;++i) for(j=i;j<=C;j+=i) fc[i]+=C/j;
}#define C(x,y,z) (fa[x]*fb[y]*fc[z])
#define cal(x,y,z) (C(x,y,z)+C(x,z,y)+C(y,x,z)+C(y,z,x)+C(z,x,y)+C(z,y,x))int main()
{register int g,i,j,k,x,y,w;T=read();init_mu();while(T--){A=read();B=read();C=read();init();for(i=1;i<=M;++i)if(mu[i])ans+=mu[i]*mu[i]*mu[i]*fa[i]*fb[i]*fc[i];for(g=1;g<=N;++g)for(i=1;i*g<=N;++i)if(mu[i*g])for(j=i+1;1ll*i*j*g<=N;++j)if(mu[j*g]&&gcd(i,j)==1){x=i*g;y=j*g;++d[x];++d[y];e[++en]=(Edge){x,y,x*j};w=x*j;ans+=1ll*mu[x]*mu[x]*mu[y]*(fa[x]*fb[w]*fc[w]+fa[w]*fb[x]*fc[w]+fa[w]*fb[w]*fc[x]);ans+=1ll*mu[x]*mu[y]*mu[y]*(fa[y]*fb[w]*fc[w]+fa[w]*fb[y]*fc[w]+fa[w]*fb[w]*fc[y]);}for(i=1;i<=en;++i)if(d[e[i].f]>d[e[i].t]||(d[e[i].f]==d[e[i].t]&&e[i].f<e[i].t)) G[e[i].f].push_back((edge){e[i].t,e[i].lcm});else G[e[i].t].push_back((edge){e[i].f,e[i].lcm});for(i=1;i<=N;++i){for(j=G[i].size()-1;~j;--j) mrk[G[i][j].to]=G[i][j].lcm;for(j=G[i].size()-1;~j;--j){x=G[i][j].to;register int ix=G[i][j].lcm,iy;for(k=G[x].size()-1;~k;--k)if(iy=mrk[y=G[x][k].to]){register int xy=G[x][k].lcm;ans+=mu[i]*mu[x]*mu[y]*cal(ix,iy,xy);}}for(j=G[i].size()-1;~j;--j) mrk[G[i][j].to]=0;}printf("%lld\n",ans%mod);}
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10280169.html

[bzoj 5332][SDOI2018]旧试题相关推荐

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

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

  2. [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_ ...

  3. 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_{ ...

  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. Algorithm Review 3 数论

    数论 若 a≡b(modm)a \equiv b (\mod m)a≡b(modm),则 (a,m)=(b,m)(a, m) = (b, m)(a,m)=(b,m). a≡b(modmi)(1≤i≤n ...

  7. 图论,专为迷途少年而生

    文章目录 目录 图的存储 邻接矩阵 前向星 Topsort P1038 神经网络 P1983 车站分级 最小生成树 MST 堆优化Prim 并查集Kruskal Matrix Tree Theory ...

  8. 今天给大家分享几款试卷下载器和试卷生成器

    今天给大家分享几款试卷下载器和试卷生成器.随着互联网技术的不断发展,这些工具不仅可以帮助我们更加便捷地获取所需试卷和答案,还可以提高出题质量和效率.下面就让我们一起来看看这些实用的工具吧. 分享一:学 ...

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

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

最新文章

  1. 【leetcode】132. Palindrome Partitioning II
  2. BUGLY集成升级空指针问题
  3. HDU Redraw Beautiful Drawings 推断最大流是否唯一解
  4. 又一个绝对棒的对话框插件fancybox v1.3.4
  5. 关于CSplitterWnd类窗口静态分割总结
  6. log4cpp 用法
  7. https://www.nowcoder.com/acm/contest/107/F
  8. 算法设计与分析基础 第八章谜题
  9. Kotlin教程(一):走进Kotlin的世界
  10. CSS3参考手册(所有属性)
  11. php无法找到该页,UCHOME出现问题(转帖)
  12. 阿里云ACA、ACP、ACE认证考试常见问题
  13. iOS 制作圆形头像图片
  14. Excel的IYQ钓鱼
  15. 水井坊:“高端化”的尴尬与库存危机
  16. 2023年兰州大学植物学考研上岸前辈备考经验指导
  17. 原神私服搭建三:(启动器下载和设置代理)
  18. 使用腾讯IM实现uni-app小程序中的客服聊天
  19. Sql处理数字保留两位小数,而且四舍五入。
  20. fffffffffffffffffffffffffffffffff

热门文章

  1. delphi调用选择目录对话框
  2. ubuntu安装curl报错或get update失败
  3. 可视化:在窗口中显示一个球,该球以与水平成45度夹角作直线运动,当遇到边界时,反弹回来,仍与水平成45度角继续运动。
  4. Unresolved compilation problem: String liter
  5. Netty出现的原因以及多种Reactor模式
  6. 图像和流媒体 -- Sapera 安装遇到的问题
  7. 【译】Persistent reverse (NAT bypassing) SSH tunnel access with autossh
  8. JVM内存区域划分及其管理机制
  9. android popupwindow 自定义背景,android – 无法将PopupWindow背景设置为透明
  10. adapt和adopt的区别_脸盲了,adopt和adapt要如何区分?