【Luogu】 P4619 [SDOI2018] 旧试题

题目链接

点击打开链接

题目解法

考虑 d ( i j k ) d(ijk) d(ijk) 不好求
但我们可以转化 d ( i j k ) = ∑ u ∣ i ∑ v ∣ j ∑ w ∣ k [ ( u , v ) = 1 ] [ ( u , w ) = 1 ] [ ( v , w ) = 1 ] d(ijk)=\sum\limits_{u|i}\sum\limits_{v|j}\sum\limits_{w|k}[(u,v)=1][(u,w)=1][(v,w)=1] d(ijk)=uivjwk[(u,v)=1][(u,w)=1][(v,w)=1](我是做这道题的时候才知道这个式子的,但感觉挺有用的)
看到了熟悉的 gcd ⁡ ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1 的形式,然后就可以开始莫比乌斯反演
A n s = ∑ i = 1 A ∑ j = 1 B ∑ k = 1 C ∑ u ∣ i ∑ v ∣ j ∑ w ∣ k [ ( u , v ) = 1 ] [ ( u , w ) = 1 ] [ ( v , w ) = 1 ] = ∑ i = 1 A ∑ j = 1 B ∑ k = 1 C ∑ u ∣ i ∑ v ∣ j ∑ w ∣ k ∑ d 1 ∣ u , d 1 ∣ v μ ( d 1 ) ∑ d 2 ∣ u , d 2 ∣ w μ ( d 2 ) ∑ d 3 ∣ v , d 3 ∣ w μ ( d 3 ) Ans=\sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^C\sum\limits_{u|i}\sum\limits_{v|j}\sum\limits_{w|k}[(u,v)=1][(u,w)=1][(v,w)=1]\\ =\sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^C\sum\limits_{u|i}\sum\limits_{v|j}\sum\limits_{w|k}\sum\limits_{d1|u,d1|v}\mu(d1)\sum\limits_{d2|u,d2|w}\mu(d2)\sum\limits_{d3|v,d3|w}\mu(d3) Ans=i=1Aj=1Bk=1Cuivjwk[(u,v)=1][(u,w)=1][(v,w)=1]=i=1Aj=1Bk=1Cuivjwkd1∣u,d1∣vμ(d1)d2∣u,d2∣wμ(d2)d3∣v,d3∣wμ(d3)
发现枚举 i , j , k i,j,k i,j,k 没有必要
所以 A n s = ∑ u ∣ i ∑ v ∣ j ∑ w ∣ k ⌊ A u ⌋ ⌊ B v ⌋ ⌊ C w ⌋ ∑ d 1 ∣ u , d 1 ∣ v μ ( d 1 ) ∑ d 2 ∣ u , d 2 ∣ w μ ( d 2 ) ∑ d 3 ∣ v , d 3 ∣ w μ ( d 3 ) Ans=\sum\limits_{u|i}\sum\limits_{v|j}\sum\limits_{w|k}\lfloor \frac{A}{u}\rfloor\lfloor \frac{B}{v}\rfloor\lfloor \frac{C}{w}\rfloor\sum\limits_{d1|u,d1|v}\mu(d1)\sum\limits_{d2|u,d2|w}\mu(d2)\sum\limits_{d3|v,d3|w}\mu(d3) Ans=uivjwkuAvBwCd1∣u,d1∣vμ(d1)d2∣u,d2∣wμ(d2)d3∣v,d3∣wμ(d3)
交换循环顺序,先枚举 d 1 , d 2 , d 3 d1,d2,d3 d1,d2,d3
可得 A n s = ∑ d 1 μ ( d 1 ) ∑ d 2 μ ( d 2 ) ∑ d 3 μ ( d 3 ) ∑ [ u , v ] ∣ i ∑ [ u , w ] ∣ j ∑ [ v , w ] ∣ k ⌊ A u ⌋ ⌊ B v ⌋ ⌊ C w ⌋ Ans=\sum\limits_{d1}\mu(d1)\sum\limits_{d2}\mu(d2)\sum\limits_{d3}\mu(d3)\sum\limits_{[u,v]|i}\sum\limits_{[u,w]|j}\sum\limits_{[v,w]|k}\lfloor \frac{A}{u}\rfloor\lfloor \frac{B}{v}\rfloor\lfloor \frac{C}{w}\rfloor Ans=d1μ(d1)d2μ(d2)d3μ(d3)[u,v]i[u,w]j[v,w]kuAvBwC
我们令 g A i gA_i gAi 表示 ∑ ⌊ A i ⌋ + ⌊ A 2 i ⌋ + . . . \sum \lfloor \frac{A}{i} \rfloor+\lfloor \frac{A}{2i} \rfloor+... iA+2iA+...,同理我们定义 g B i gB_i gBi g C i gC_i gCi
g A , g B , g C gA,gB,gC gA,gB,gC 都是可以用 O ( n ln ⁡ n ) O(n\ln n) O(nlnn) 的时间暴力求出的
所以 A n s = ∑ d 1 μ ( d 1 ) ∑ d 2 μ ( d 2 ) ∑ d 3 μ ( d 3 ) g A ( [ d 1 , d 2 ] ) g B ( [ d 1 , d 3 ] ) g C ( [ d 2 , d 3 ] ) Ans=\sum\limits_{d1}\mu(d1)\sum\limits_{d2}\mu(d2)\sum\limits_{d3}\mu(d3)gA([d1,d2])gB([d1,d3])gC([d2,d3]) Ans=d1μ(d1)d2μ(d2)d3μ(d3)gA([d1,d2])gB([d1,d3])gC([d2,d3])
上面的推导感觉很自然

考虑直接枚举 d 1 , d 2 , d 3 d1,d2,d3 d1,d2,d3 的复杂度仍然很高,但我们可以感受到三元组 d 1 , d 2 , d 3 d1,d2,d3 d1,d2,d3 的组数不是很大
接下来的一步就很神了
我们把 i , j i,j i,j 之间连边当且仅当 μ ( i ) ≠ 0 , μ ( j ) ≠ 0 \mu(i)\neq 0,\mu(j)\neq 0 μ(i)=0μ(j)=0
我们用暴力跑过之后发现边数最多为 760741 760741 760741,是可以接受暴力枚举三元环的 O ( m m ) O(m\sqrt m) O(mm ) 的复杂度的
于是直接建完图之后暴力枚举三元环即可
如何建图?枚举 g c d ( i , j ) gcd(i,j) gcd(i,j),然后就是找到 ( i ′ , j ′ ) = 1 (i',j')=1 (i,j)=1 的对,然后建图
注意考虑 u = v = w u=v=w u=v=w u = v / u = w / v = w u=v/u=w/v=w u=v/u=w/v=w 的情况
u = v = w u=v=w u=v=w 的情况可以直接枚举
u = v / u = w / v = w u=v/u=w/v=w u=v/u=w/v=w 的情况可以建图时顺带做一下
时间复杂度 O ( T m m ) O(Tm\sqrt m) O(Tmm )

#include <bits/stdc++.h>
#define swap(x,y) x^=y^=x^=y
#define pb push_back
using namespace std;
const int N=200100,P=1e9+7;
typedef long long LL;
inline int read(){int FF=0,RR=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;return FF*RR;
}
typedef pair<int,int> pii;
int mu[N];
int gA[N],gB[N],gC[N],deg[N],tag[N];
vector<pii> G[N];
tuple<int,int,int> E[761000];
void work(){int A=read(),B=read(),C=read();//calc gAfor(int i=1;i<=A;i++) for(int j=1;j<=A/i;j++) gA[i]+=A/i/j;//calc gBfor(int i=1;i<=B;i++) for(int j=1;j<=B/i;j++) gB[i]+=B/i/j;//calc gCfor(int i=1;i<=C;i++) for(int j=1;j<=C/i;j++) gC[i]+=C/i/j;int mn=min(A,min(B,C)),mx=max(A,max(B,C));LL ans=0;//u=v=wfor(int d=1;d<=mn;d++) if(mu[d]) ans+=1ll*mu[d]*gA[d]*gB[d]*gC[d];int tot=0;for(int g=1;g<=mx;g++)for(int i=1;i<=mx/g;i++) if(mu[i*g])for(int j=i+1;j<=mx/g/i;j++) if(mu[j*g]&&__gcd(i,j)==1){//u=v 或 u=w 或 v=wans+=mu[j*g]*(1ll*gA[i*j*g]*gB[i*j*g]*gC[i*g]+1ll*gA[i*j*g]*gB[i*g]*gC[i*j*g]+1ll*gA[i*g]*gB[i*j*g]*gC[i*j*g]);ans+=mu[i*g]*(1ll*gA[i*j*g]*gB[i*j*g]*gC[j*g]+1ll*gA[i*j*g]*gB[j*g]*gC[i*j*g]+1ll*gA[j*g]*gB[i*j*g]*gC[i*j*g]);deg[i*g]++,deg[j*g]++;E[++tot]={i*g,j*g,i*j*g};}for(int i=1;i<=tot;i++){int x=get<0>(E[i]),y=get<1>(E[i]),z=get<2>(E[i]);if(deg[x]<deg[y]) swap(x,y);G[x].pb({y,z});}//u,v,w互不相等for(int i=1;i<=mx;i++){for(auto [j,lcm]:G[i]) tag[j]=lcm;for(auto [j,lcm1]:G[i])for(auto [k,lcm2]:G[j])if(tag[k])ans+=mu[i]*mu[j]*mu[k]*(1ll*gA[lcm1]*gB[lcm2]*gC[tag[k]]+1ll*gA[lcm1]*gB[tag[k]]*gC[lcm2]+1ll*gA[lcm2]*gB[lcm1]*gC[tag[k]]+1ll*gA[lcm2]*gB[tag[k]]*gC[lcm1]+1ll*gA[tag[k]]*gB[lcm1]*gC[lcm2]+1ll*gA[tag[k]]*gB[lcm2]*gC[lcm1]);for(auto [j,lcm]:G[i]) tag[j]=0;}printf("%d\n",ans%P);for(int i=1;i<=mx;i++) gA[i]=gB[i]=gC[i]=0,G[i].clear(),deg[i]=0;
}
int v[N],pr[N],cnt;
void sieve(int n){mu[1]=1;for(int i=2;i<=n;i++){if(!v[i]) v[i]=i,pr[++cnt]=i,mu[i]=-1;for(int j=1;j<=cnt&&pr[j]<=n/i;j++){v[pr[j]*i]=pr[j];if(v[i]==pr[j]) break;mu[pr[j]*i]=-mu[i];}}
}
int main(){sieve(N-1);int T=read();while(T--) work();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven的详细介绍(maven的全据配置以及idea中maven的配置)

maven的理解 Maven 是一个强大的项目管理和构建自动化工具&#xff0c;它通过抽象的项目对象模型(POM&#xff1a;Project Object Model)和构建生命周期模型(Project Lifecycle)来对项目及其构建过程进行管理(Dependency Management System)&#xff0c;Maven 最大化的消除了构…

Spring MVC(中)

1、Spring MVC视图&#xff1a; SpringMVC中的视图是View接口&#xff0c;视图的作用渲染数据&#xff0c;将模型Model中的数据展示给用户 SpringMVC视图的种类很多&#xff0c;默认有转发视图和重定向视图 当工程引入jstl的依赖&#xff0c;转发视图会自动转换为JstlView …

【TensorFlow1.X】系列学习笔记【入门二】

【TensorFlow1.X】系列学习笔记【入门二】 大量经典论文的算法均采用 TF 1.x 实现, 为了阅读方便, 同时加深对实现细节的理解, 需要 TF 1.x 的知识 文章目录 【TensorFlow1.X】系列学习笔记【入门二】前言神经网络的参数神经网络的搭建前向传播反向传播 总结 前言 学习了张量、…

SpringBoot 第一个接口编写

RestController //表示该类为请求处理类public class HttpDeal {RequestMapping("/login")//这个方法处理哪一个地址过来的请求public String hello(){return "返回给浏览器";}}

测试Android webview 加载本地html

最近开发一个需要未联网功能的App, 不熟悉使用Java原生开发界面&#xff0c;于是想使用本地H5做界面&#xff0c;本文测试了使用本地html加载远程数据。直接上代码&#xff1a; MainActivity.java package com.alex.webviewlocal;import androidx.appcompat.app.AppCompatAct…

空值合并运算符(??)及其使用场景

空值合并操作符&#xff08;??&#xff09; 是一个逻辑操作符&#xff0c;当左侧的操作数为 null 或者 undefined 时&#xff0c;返回其右侧操作数&#xff0c;否则返回左侧操作数。 与逻辑或操作符&#xff08;||&#xff09; 不同&#xff0c;逻辑或操作符会在左侧操作数为…

DataGridView的下拉DataGridViewComboBoxColumn的数据绑定问题

DataGridView的下拉DataGridViewComboBoxColumn的数据绑定问题 需求&#xff1a;左边这列固定x行&#xff0c;右边显示下拉&#xff0c;并且赋上默认值 public void Set(){// 添加需要固定显示的行数dataGridView1.Rows.Add("早班";dataGridView1.Rows.Add("中…

小团队之间有哪些好用免费的多人协同办公软件

在小团队协作中&#xff0c;选择适合的多人协同办公软件是提高工作效率和团队协作的重要一环。幸运的是&#xff0c;市场上有许多大多数功能都免费的多人协同办公软件&#xff0c;为小团队提供了强大的协作功能和便捷的工作环境。 在本文中&#xff0c;我将根据自己多年的在线…

[C++] C++入门

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C和Linux &#x1f33c;博客专栏&#xff1a;C入门 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&#x1f3fb; …

Cesium Vue(六)— 材质(Material)

1. 设置entity材质 添加棋盘纹理材质 // 棋盘纹理 let material new Cesium.CheckerboardMaterialProperty({ evenColor: Cesium.Color.RED, oddColor: Cesium.Color.YELLOW, repeat: new Cesium.Cartesian2(2, 2), });添加条纹纹理材质 // 条纹纹理 let material new Cesium…

Java利用反射和读取xml实现迷你容器

由于需要框架能实现多态&#xff0c;达到控制反转解耦。所以容器还是需要的&#xff0c;容器的存在可以简化对象获取工作&#xff0c;但是容器也不是万能的。合理使用即可&#xff0c;Spring对我来说太庞大了&#xff0c;用不着&#xff0c;为此给框架写一个迷你版容器。 容器…

Qt中Json的操作

在 Json的两种格式中介绍了Json的格式以及应用场景。由于这种数据格式与语言无关,下面介绍一下Json在Qt中的使用。 从Qt 5.0开始提供了对Json的支持,我们可以直接使用Qt提供的Json类进行数据的组织和解析。相关的类常用的主要有四个,具体如下: Json类介绍 QJsonDocument |…

OpenAI接口开发指南

OpenAI主要API OpenAI Api 官方地址为&#xff1a;https://platform.openai.com/docs/api-reference&#xff0c;常用的 OpenAI Api 接口总共分为 4 类&#xff1a;对话类、私有化模型训练类、通用类、图片 & 音频类&#xff0c;其中对话类与私有化模型训练类是最常用的。…

【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅰ—— 生成 CSR

目录 替换拓扑图证书关系示意图说明 & 关联博文 1. 默认证书截图2. 使用certificate-manager生成CSR2.1 创建存放CSR的目录2.2 记录PNID和IP2.3 生成CSR2.4 验证CSR 参考资料 替换拓扑图 证书关系示意图 默认情况下&#xff0c;VMCA 与 Machine SSL的关系是 本系列博文要…

UE5--物体卡片与材质入门

参考资料&#xff1a; 《Unreal Engine5 入门到精通》--左央 虚幻引擎5.2文档&#xff1a;https://docs.unrealengine.com/5.2/zh-CN/ 前言&#xff1a; 跟着左央老师的《Unreal Engine5 入门到精通》学习制作AI版胡闹厨房&#xff0c;把学习过程与学习到的东西归纳总结起来。 …

Ruby 之 csv 文件读写

csv 文件写入 require csvtitle ["col1", "col2"] contents [["row11", "row12"], ["row21", "row22"]]csv1 CSV.open("test1.csv", "wb") do |csv|# write file titlecsv << titl…

【网络协议】聊聊网关 NAT机制

再宿舍的时候&#xff0c;其实只能通过局域网进行处理&#xff0c;但是如果接入互联网&#xff0c;一般是配置路由器当然还有网关。 MAC头和IP头的细节 一旦配置了IP地址和网关&#xff0c;就可以制定目标地址进行访问。 MAC头主要信息目标和源MAC地址&#xff0c;以及协议类…

OpenCV显示中文(python)

OpenCV添加文字的方法putText(…)&#xff0c;添加英文是没有问题的&#xff0c;但如果你要添加中文就会出现“&#xff1f;&#xff1f;&#xff1f;”的乱码&#xff0c;需要特殊处理一下。 下文提供封装好的&#xff08;代码&#xff09;方法&#xff0c;供OpenCV添加中文使…

hive substr用法

hive substr用法 substr(string A, int start, int len) 其中start大於0&#xff0c;表示從前往后取數據&#xff0c;start小於0&#xff0c;表示從後往前取數據 if(matnr like 0000000000%, substring(matnr, -8), matnr) matnr,取倒數8個數 if(matnr like 0000000000%, subs…

【试题040】多个逻辑或例题2

1.题目&#xff1a;设int n0;&#xff0c;执行表达式n ||(n-1) ||(n0)||(n1)||(n2)后n的值是 &#xff1f; 2.代码解析&#xff1a; 逻辑或 || 运算符是一个短路运算符&#xff0c;它从左到右依次计算表达式&#xff0c;如果遇到一个为真&#xff08;非零&#xff09;的值&am…