首页 > 其他分享 >CF1780 F.Three Chairs - 题解

CF1780 F.Three Chairs - 题解

时间:2023-01-26 12:23:09浏览次数:42  
标签:pr CF1780 limits Chairs 题解 sum mu ++ int

给定数列 \(\{ a_n \}\),求无序三元组 \((i, j, k)\) 的数量,满足 \(\gcd(\min(a_i, a_j, a_k), \max(a_i, a_j, a_k)) = 1\),\(n \leq 3 \cdot 10^5, a_i \leq 3 \cdot 10 ^ 5\) 且 \(a_i\) 互不相同。


记 \([~]\) 为艾佛森括号,\(V = \max(a_i), e_i = [i \in \{a_n\}],s_i = \sum \limits_{j = 1} ^ i e_j\)。

考虑枚举 \((a_i, a_j, a_k)\) 中的最小值与最大值,记最大值为 \(i\),最小值为 \(j\),则第三个数值有 \(\sum \limits_{x = j + 1} ^ {i - 1} e_x = s_{i - 1} - s_j\) 种方案。容易得到如下结果。

\[Ans = \sum \limits_{i = 2} ^ {V} [e_i = 1]\sum \limits_{j = 1} ^ {i - 1} [e_j = 1][\gcd(i, j) = 1](s_{i - 1} - s_j) \]

对 \([\gcd(i, j) = 1]\) 作莫比乌斯反演,得

\[\begin{aligned} Ans &= \sum \limits_{i = 2} ^ {V} [e_i = 1]\sum \limits_{j = 1} ^ {i - 1} [e_j = 1](s_{i - 1} - s_j) \sum \limits_{d | i, d | j} \mu(d) \\ &= \sum \limits_{d = 1} ^ V \mu(d) \sum \limits_{i = 1} ^ {\lfloor \frac{V}{d} \rfloor} [e_{di} = 1]\sum \limits_{j = 1} ^ {i - 1} [e_{dj} = 1](s_{di - 1} - s_{dj})\\ &= \sum \limits_{d = 1} ^ V \mu(d) \sum \limits_{i = 1} ^ {\lfloor \frac{V}{d} \rfloor} ([e_{di} = 1] s_{di - 1} (i - 1) - \sum \limits_{j = 1} ^ {i - 1} [e_{dj} = 1] s_{dj}) \end{aligned} \]

括号内部的 \(\sum \limits_{j = 1} ^ {i - 1} [e_{dj} = 1] s_{dj}\) 可以随 \(i\) 的枚举递推,故由调和级数知计算该式的时间复杂度为 \(\mathcal{O}(n \log n)\),可以通过本题。

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
constexpr int V = 3e5 + 10;
vector<int> pr, mu(V), vis(V);
void sieve(){
	mu[1] = 1;
	for(int i = 2; i < V; i++){
		if(!vis[i]) mu[i] = -1, pr.push_back(i);
		for(int j = 0; j < pr.size() && pr[j] * i < V; j++){
			vis[pr[j] * i] = 1;
			if(i % pr[j] == 0) break;
			mu[pr[j] * i] = -mu[i];
		}
	}
}
// 线性筛计算 mu 函数
void solve(){
	int n; cin >> n;
	vector<int> a(n), s(V, 0), exist(V, 0);
	for(int i = 0; i < n; i++)
		cin >> a[i], s[a[i]]++, exist[a[i]] = 1;
	for(int i = 1; i < V; i++) s[i] += s[i - 1];
	
	i64 ans = 0;
	for(int d = 1; d < V; d++){
		i64 r = 0, A = 0, e = 0;
		for(int i = 1; i * d < V; i++){
			if(!exist[i * d]) continue;
			r += 1LL * s[i * d - 1] * e - A;
			A += s[i * d];
			e++;
		}
		ans += mu[d] * r;
	}
	cout << ans << "\n";
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	sieve();
	solve();	
}

笔者为数不多的场切 \(2F\) 题,以此纪念

标签:pr,CF1780,limits,Chairs,题解,sum,mu,++,int
From: https://www.cnblogs.com/chroneZ/p/17067685.html

相关文章

  • ajax跨域访问的问题解决
    在web项目中经常用到在ajax中进行跨域访问,比如在a域中访问b域中的服务,却实现不了。原因是:浏览器为了保证服务器数据的安全,对于这种请求,所给予的权限是较低的,通常只允许调用......
  • CF1780B GCD Partition
    从\(k\)的角度出发,可以发现一定存在某种\(k=2\)的划分方式,使得最终获得的分数最大。为什么呢?假定划分为\(k=3\)时取得了最大分数,即\(\gcd(b_1,b_2,b_3)=g......
  • 题解 CF1780G【Delicious Dessert】
    SAM板子题。在P3804【模板】后缀自动机(SAM)中,我们已经会求每个等价类(SAM状态)在原串中的出现次数。本题中,我们需要求所有长度能被出现次数整除的子串。我们知道一......
  • CF850F 题解
    题意传送门有一袋\(n\)个颜色球,第\(i\)个颜色的球有\(a_i\)个。当袋子里至少有两个不同颜色的球时,执行以下步骤:一个接一个的按照顺序随机取出两个的球,这些球......
  • 安装OpenCV时提示缺少boostdesc_bgm.i文件的问题解决方案
    安装OpenCV时,会遇到下面的错误/home/zhang/slam/opencv-3.4.5/opencv_contrib/modules/xfeatures2d/src/boostdesc.cpp:653:20:fatalerror:boostdesc_bgm.i:没有那个文......
  • LeetCode-343. 整数拆分 - 题解分析
    题目来源343.整数拆分题目详情给定一个正整数 n ,将其拆分为k个正整数的和( k>=2 ),并使这些整数的乘积最大化。返回你可以获得的最大乘积 。示例1:输入:......
  • 题解 CF1773H【Hot and Cold】
    赛时跟队友一起摆烂了,于是没做出来,回来补题。如果询问到了答案,可以直接判断并退出,因此下文的询问过程并没有考虑这一点。显然“\((1,1)\)比\((0,0)\)离所求位置更近”......
  • 关于gnome-control-center的问题解决
    突然发现电脑桌面的设置无法打开,点击后一直转圈。在网上研究了一圈,发现可能是gnome出了问题,输入指令gnome-control-center,结果报了如下错误:gnome-control-center:......
  • 洛谷 P1478 陶陶摘苹果(升级版) 题解
    这道题只要会自定义cmp恰当地进行排序,其他部分没有什么大问题。上代码:1#include<bits/stdc++.h>2usingnamespacestd;3intn,s,h1,h2,cnt;4structapple{......
  • CF Educational Round 142 (Rated for div2) 题解
    A注意到除了血量为\(1\)的怪物,其余的怪物直接斩杀是更合理的。所以只要统计血量为\(1\)的怪物的个数即可。#include<cstdio>voidsolve(){ intn;scanf("%d",......