Codeforces Round 911 (Div. 2)DE「欧拉反演」「tarjan缩点+DAG上dp」

Problem - D - Codeforces

思路

只选两个小数计算贡献,可对序列排序,每对 ( i , j ) (i, j) (i,j) 其中 ( i < j ) (i<j) (i<j)的的贡献是 g c d ( i , j ) ⋅ ( n − j ) gcd(i, j) \cdot (n - j) gcd(i,j)(nj)
通过预处理因数+欧拉反演可将复杂度降为 O ( n V ) O(nV) O(nV)
n = Σ d ∣ n φ ( d ) 令 n = g c d ( i , j ) 得到 g c d ( i , j ) = Σ d ∣ ( i , j ) φ ( d ) = Σ d ∣ i Σ d ∣ j φ ( d ) . 可以求 Σ i = 1 n g c d ( i , n ) = Σ i = 1 n Σ d ∣ i Σ d ∣ n φ ( d ) = Σ d ∣ n Σ i = 1 n Σ d ∣ i φ ( d ) = Σ d ∣ n n d φ ( d ) . 题目要求 Σ i = 1 Σ j = i + 1 g c d ( a [ i ] , a [ j ] ) ⋅ ( n − j ) = Σ j = 1 n Σ i = 1 j g c d ( a [ i ] , a [ j ] ) ⋅ ( n − j ) = Σ j = 1 n Σ d ∣ a [ j ] a [ j ] d φ ( d ) ⋅ ( n − j ) = Σ j = 1 n Σ d ∣ a [ j ] c n t [ d ] φ ( d ) ⋅ ( n − j ) . \begin{aligned} n & = \Sigma_{d | n} \varphi(d)\\ 令n & = gcd(i, \ j) \\ 得到gcd(i, \ j) &= \Sigma_{d | (i, \ j)} \varphi(d) \\ & = \Sigma_{d | i} \Sigma_{d | j} \varphi(d). \\\\ 可以求 \Sigma_{i = 1} ^ n gcd(i, \ n) &= \Sigma_{i = 1} ^ n \Sigma_{d | i} \Sigma_{d | n} \varphi(d) \\ &= \Sigma_{d | n} \Sigma_{i = 1} ^ n \Sigma_{d | i} \varphi(d) \\ &= \Sigma_{d | n} \frac{n}{d} \varphi(d).\\\\ 题目要求& \Sigma_{i = 1} \Sigma_{j = i + 1}gcd(a[i],\ a[j]) \cdot (n - j) \\ &= \Sigma_{j = 1} ^ n \Sigma_{i = 1} ^ jgcd(a[i], \ a[j]) \cdot(n - j) \\ &= \Sigma_{j = 1} ^ n \Sigma_{d | a[j]} \frac{a[j]}{d} \varphi(d) \cdot(n - j) \\ &= \Sigma_{j = 1} ^ n \Sigma_{d | a[j]} cnt[d] \varphi(d) \cdot(n - j). \end{aligned} nn得到gcd(i, j)可以求Σi=1ngcd(i, n)题目要求=Σdnφ(d)=gcd(i, j)=Σd(i, j)φ(d)=ΣdiΣdjφ(d).=Σi=1nΣdiΣdnφ(d)=ΣdnΣi=1nΣdiφ(d)=Σdndnφ(d).Σi=1Σj=i+1gcd(a[i], a[j])(nj)=Σj=1nΣi=1jgcd(a[i], a[j])(nj)=Σj=1nΣda[j]da[j]φ(d)(nj)=Σj=1nΣda[j]cnt[d]φ(d)(nj).

参考博客:欧拉函数|(扩展)欧拉定理|欧拉反演 - Morning_Glory - 博客园 (cnblogs.com)

另:

一个序列的两两 g c d gcd gcd = φ ( d ) ⋅ C ( c n t [ d ] , 2 ) =\varphi(d) \cdot C(cnt[d], 2) =φ(d)C(cnt[d],2),仿照莫队可以推得,当 c n t [ d ] cnt[d] cnt[d]增加1时,对当前位置答案的影响为 φ ( d ) ⋅ c n t [ d ] \varphi(d) \cdot cnt[d] φ(d)cnt[d],对每一位计算贡献后乘位权即可。

AC代码
#include <bits/stdc++.h>
using namespace std;
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
//#define int ll
#define pb push_back
#define eb emplace_back
#define m_p make_pair
const int mod = 998244353;
#define mem(a,b) memset(a,b,sizeof a)
#define pii pair<int,int>
#define fi first
#define se second
const int inf = 0x3f3f3f3f;
const int N = 3e5 + 50;
//__builtin_ctzll(x);后导0的个数
//__builtin_popcount计算二进制中1的个数
int a[N];
vector<int> fac[N];
bool is[N]; //筛数组
int pri[N]; //素数数组
int phi[N]; //欧拉函数
int tot=0;  //素数个数
int n;
ll cnt[N];void init(){for(int i=1;i<N;++i){is[i]=1;}is[0]=is[1]=0;phi[1]=1;for(int i=2;i<N;++i){if(is[i]){pri[++tot]=i;phi[i]=i-1;}for(int j=1;j<=tot && pri[j]*i<N;++j){is[pri[j]*i]=0;if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}else{phi[i*pri[j]]=phi[i]*(pri[j]-1);}}}
}void work() {int n;cin >> n;for (int i = 1; i < N; ++i) {cnt[i] = 0;}int maxx = 0;for (int i = 1; i <= n; ++i) {cin >> a[i];}sort(a + 1, a + 1 + n);ll ans = 0;for (int i = 1; i <= n; ++i) {ll now = 0;for (auto x:fac[a[i]]) {now += phi[x] * cnt[x];cnt[x]++;}ans += now * (n - i);}cout << ans << '\n';
}signed main() {io;int t = 1;cin >> t;for (int i = 1; i < N; ++i) {for (int j = 1; j * i < N; ++j) {fac[i * j].pb(i);}}init();while (t--) {work();}return 0;
}

Problem - E - Codeforces

思路

可以发现,通过传递拓展到的边一定是将原有路径变短,不符合我们需要的答案,所以拓展是无用的操作,只管原图即可。图中最难处理的是有向环,有向环可以跑到环上任意一点出去,自然联想 t a r j a n tarjan tarjan缩点,缩点后在 D A G DAG DAG图上跑 d p dp dp就可以得到答案。

AC代码
#include <bits/stdc++.h>
using namespace std;
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
//#define int ll
#define pb push_back
#define eb emplace_back
#define m_p make_pair
const int mod = 998244353;
#define mem(a,b) memset(a,b,sizeof a)
#define pii pair<int,ll>
#define fi first
#define se second
const ll inf = 0x3f3f3f3f3f3f3f3f;
const int N = 3e5 + 50;
//__builtin_ctzll(x);后导0的个数
//__builtin_popcount计算二进制中1的个数
int a[N];
int n, m, val[N], h[N], e[N], ne[N], idx;
int in[N];
int dfn[N], low[N], dfncnt, s[N], in_stack[N], tp;
int scc[N], sc;  // 结点 i 所在 SCC 的编号
int sz[N];       // 强连通 i 的大小
ll sum[N];      // 强连通 i 的权值
pii dp[N];void add(int u, int v) {e[++idx] = v, ne[idx] = h[u], h[u] = idx;
}void tarjan(int u) {low[u] = dfn[u] = ++dfncnt, s[++tp] = u, in_stack[u] = 1;for (int i = h[u]; i; i = ne[i]) {int v = e[i];if (!dfn[v]) {tarjan(v);low[u] = min(low[u], low[v]);} else if (in_stack[v]) {low[u] = min(low[u], dfn[v]);}}if (dfn[u] == low[u]) {++sc;while (s[tp] != u) {scc[s[tp]] = sc;sz[sc]++;sum[sc] += val[s[tp]];in_stack[s[tp]] = 0;--tp;}scc[s[tp]] = sc;sz[sc]++;sum[sc] += val[s[tp]];in_stack[s[tp]] = 0;--tp;}
}vector<int> ed[N];void work() {cin >> n >> m;dfncnt = tp = sc = idx = 0;for (int i = 1; i <= n; i++) {h[i] = 0;sum[i] = dfn[i] = low[i] = s[i] = in_stack[i] = sz[i] = scc[i] = 0;in[i] = 0;ed[i].clear();}for (int i = 1; i <= n; ++i) {cin >> val[i];dp[i].fi = 0;dp[i].se = inf;}for (int i = 1; i <= m; ++i) {int u, v;cin >> u >> v;add(u, v);}for (int i = 1; i <= n; ++i) {if (!dfn[i]) tarjan(i);}for (int i = 1; i <= n; ++i) {int u = scc[i];for (int j = h[i]; j ; j = ne[j]) {int v = scc[e[j]];if (u == v) continue;ed[v].pb(u);in[u]++;}}queue<int>q;for (int i = 1; i <= sc; ++i) {if (in[i] == 0) {q.push(i);if (dp[i].fi == sz[i]) dp[i].se = min(dp[i].se, sum[i]);else if (dp[i].fi < sz[i]) dp[i] = {sz[i], sum[i]};}}while (!q.empty()) {int now = q.front();q.pop();for (auto x: ed[now]) {in[x]--;if (dp[x].fi == sz[x] + dp[now].fi) dp[x].se = min(dp[x].se, sum[x] + dp[now].se);else if (dp[x].fi < sz[x] + dp[now].fi) dp[x] = {sz[x] + dp[now].fi, sum[x] + dp[now].se};if (in[x] == 0) {q.push(x);}}}ll len = 0, ans = inf;for (int i = 1; i <= sc; ++i) {if (dp[i].fi > len) len = dp[i].fi, ans = dp[i].se;else if (dp[i].fi == len) ans = min(ans, dp[i].se);}cout << len << " " << ans << '\n';
}signed main() {io;int t = 1;cin >> t;while (t--) {work();}return 0;
}

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

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

相关文章

搭建Appium工具环境

1、安装Java Development Kit&#xff08;JDK&#xff09; 前往Oracle官网下载JDK。 在https://www.oracle.com/java/technologies/javase-jdk11-downloads.html 找到最新版本的JDK。根据操作系统选择适合的版本&#xff0c;并根据指示下载安装程序。 安装JDK。运行下载的安…

Unknown error 1054

MySQL错误1054是“Unknown column”的错误&#xff0c;意味着在查询或语句中引用了一个不存在的列名。这通常是因为在查询中指定了一个不存在的列名。 解决步骤&#xff1a; 检查列名的拼写&#xff1a;确保在查询或语句中正确地输入了列名。检查大小写&#xff0c;确保与数据…

动静分离+多实例实验(nginx+tomcat)

Nginx服务器&#xff1a;192.168.188.14:80 Tomcat服务器1&#xff1a;192.168.188.11:80 Tomcat服务器2&#xff1a;192.168.188.12:8080 192.168.188.12:8081 部署Nginx负载均衡器 关闭防火墙 systemctl stop firewalld setenforce 0 安装依赖 yum -y install pcre-dev…

Java 基础学习(二)运算符与分支流程控制

1 运算符 1.1 运算符概述 1.1.1 运算符概述 运算符是一种告诉计算机执行特定的数学或逻辑等操作的符号。Java运算符号包括&#xff1a;数学运算符、关系运算符、逻辑运算符、赋值运算符号、字符串连接运算符。计算机本质上只能处理数字&#xff0c;处理数字的最常见的方式就…

csrf跨站请求伪造详解

【1】csrf跨站请求伪造的解释及解决方法 CSRF&#xff08;Cross-Site Request Forgery&#xff09;跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接 将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而…

华夏ERP信息泄露漏漏洞复现 [附POC]

文章目录 华夏ERP信息泄露漏漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 华夏ERP信息泄露漏漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#x…

好用的基于layui的免费开源后台模版layuimini

发现一个好用的后台模版 基于layui的免费开源后台模版layuimini layuimini - 基于Layui的后台管理系统前端模板 easyadmin开源项目 EasyAdmin是基于ThinkPHP6.0Layui的快速开发的后台管理系统。 演示站点 演示地址&#xff1a;跳转提示&#xff08;账号&#xff1a;admin&a…

Java实现—数据结构 1.初识集合框架

一、什么是集合框架 Java集合框架&#xff0c;又被称为容器&#xff0c;是定义在java.util包下的一组接口interfaces和其实现类classes 其主要表现为将多个元素element置于一个单元中&#xff0c; 集合框架是由若干个类组成的&#xff0c;每个类的背后就是一种数据结构&…

Jupyter Markdown 插入图片

首先截图 注意 这一步是关键的&#xff01;&#xff01; 它需要使用电脑自带的截图&#xff0c;用qq啊vx啊美图秀秀那些都不行哦。 截图之后复制&#xff1a; 然后快捷键粘贴到jupyter里面&#xff0c;它会生成一段代码&#xff08;没有代码就是说截图形式不对&#xff09;&a…

【数据结构】线段树

目录 1.概述2.代码实现2.1.聚合操作——求和2.2.聚合操作——求和、求最小值、求最大值 3.应用4.与前缀和之间的区别 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 1.概述 &#xff08;1&#xff09;线段树 (Segment Tree) 是一种二叉树形数据结构&#xff…

linux 用户级别修改文件句柄数不生效

修改/etc/security/limits.conf 句柄数后发现无效需要执行以下操作。 1. vi /etc/ssh/sshd_config 2. StrictModes no/yes 3. UsePAM yes 4. service sshd restart 5. /etc/systemd/user.conf 新增DefaultLimitNOFILE65535 6. /etc/systemd/system.conf 新增DefaultLimitN…

logback-spring.xml的内容格式

目录 一、logback-spring.xml 二、Logback 中的三种日志文件类型 一、logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <configuration scan"true" scanPeriod"10 seconds" ><!-- <statusListener…

C#使用WebSocket进行链接

C#使用WebSocket进行网络链接&#xff0c;和服务端搭建一个长连接进行通信。 有两种方式&#xff1a;串口方式&#xff08;SerialPort&#xff09;和网口方式&#xff08;Socket 包括&#xff1a;TcpClient和UdpClient&#xff09; 准备&#xff1a; 1.C#使用WebSocket的一种…

《100 Java Mistakes and How to Avoid Them》笔记 1

这几日在阅读 Manning 出版社的 《100 Java Mistakes and How to Avoid Them》, 其中列举的确实是一些容易带入到代码中的错误&#xff0c;不少还是通过代码 Review 或单元测试很难发现的问题。也有些看似很弱智&#xff0c;却可能是隐匿许久的定时炸弹&#xff0c;只等某一特定…

pandas教程:Advanced GroupBy Use 高级GroupBy用法

文章目录 12.2 Advanced GroupBy Use&#xff08;高级GroupBy用法&#xff09;1 Group Transforms and “Unwrapped” GroupBys&#xff08;组变换和无包装的GroupBy&#xff09;2 Grouped Time Resampling&#xff08;分组时间重采样&#xff09; 12.2 Advanced GroupBy Use&a…

图形编辑器开发:快捷键的管理

大家好&#xff0c;我是前端西瓜哥。 快捷键操作在图形编辑器中是很高频的操作&#xff0c;能让用户快速高效地执行特定命令&#xff0c;今天讲讲图形编辑器如果管理快捷键。 编辑器 github 地址&#xff1a; https://github.com/F-star/suika 线上体验&#xff1a; https://b…

计算机网络:网络层

0 本节主要内容 问题描述 解决思路 1 问题描述 两大问题&#xff08;重点&#xff0c;也是难点&#xff09;&#xff1a; 地址管理&#xff1b;路由选择。 1.1 子问题1&#xff1a;地址管理 网络上的这些主机和节点都需要使用一种规则来区分&#xff0c;就相当于是一种身…

说说过量 tcp pure ack 的利弊

tcp 的 ack 实在太多了&#xff0c;如果互联网上 80% 报文是 tcp&#xff0c;那么其中 1/3 的报文都是 ack&#xff0c;此前写过几篇短文&#xff0c;比如 丢弃一些 pure ack 和 注入或利用 pure ack。 简单说&#xff0c;tcp 依靠 ack 提供 self-clock&#xff0c;发送 data …

ARM异常模型

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 — 适合小白入门【目录】ARMv8/ARMv9架构高级进阶-[目录]👈👈👈 — 高级进阶、小白勿买【加群】ARM/TEE…

Docker和Kubernetes:区别与优势对比

在现代软件开发和部署中&#xff0c;Docker和Kubernetes是两个备受关注的技术。本文将对Docker和Kubernetes进行比较&#xff0c;探讨它们的区别和各自的优势。 引言 在过去的几年中&#xff0c;容器技术得到了迅速的发展&#xff0c;并且在现代软件交付和部署中扮演着越来越重…