长春集训 Day 1 - 数学专题
长春集训 Day 1 - 数学专题
A - LCMs
Description
给定长度为 \(n\) 的数组 \(a_i\),求 \(\sum\limits _{i=1}^{n-1} \sum\limits _{j=i+1}^n \mathrm{lcm}(a_i, a_j)\) 的值。
\(1 \le n \le 2 \times 10^5,\ 1 \le V \le 10^6\)。
Solution
莫比乌斯函数
定义函数 \(\mu(n)\) 服从
函数 \(\mu(n)\) 被称作莫比乌斯函数。它有如下性质
于是有推论
这条性质将”判断互质“转化为了”函数求和“,非常方便。
这一过程称为莫比乌斯反演。
答案推导
注意到答案 \(\sum\limits _{i=1}^{n-1} \sum\limits _{j=i+1}^n \mathrm{lcm}(a_i, a_j)\) 的第二个和式不从 \(1\) 起步,不满足对称性,非常不便于求解,于是可以先人为地将和式调整到对称状态,然后再手动调整一些偏移量。即
其中 \(\sum\limits _{i=1}^n a_i\) 是简单的。考虑 \(\sum\limits _{i=1}^{n} \sum\limits _{j=1}^n \mathrm{lcm}(a_i, a_j)\) 的求法。
由于 \(\mathrm{lcm}\) 不便于直接求和,所以转成 \(\gcd\),即
考虑枚举 \(\gcd\),上式变化为
将 \(g\) 提出来。注意到
由此变化为
施加莫比乌斯反演,得到
改变约束。注意到
因此上式可变为
注意到右侧括号中 \(i\) 与 \(j\) 的构型完全相同,表明这两个变量无关联,可以写成平方式,即
现在左面的两个和式比较平凡。
关注右边平方式里面的东西,这个很关键。记
由于 \(V\) 不大,可以对值域开桶。记 \(b_x\) 表示数组 \(a\) 中,数 \(x\) 出现的次数,则有
枚举 \(T\) 的倍数,根据 \(k\) 找 \(b_k\) 加入答案中,这是十分容易的。即
\(f\) 可以直接暴力预处理,前面两个和式也直接枚举即可。
线性求逆元
发现式子里有除法,需要线性求逆元。
线性求逆元的公式
Code
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
#define inf 1e18
#define debug cout << '!';
#define filein(x) freopen(#x".in", "r", stdin);
#define fileout(x) freopen(#x".out", "w", stdout);
#define file(x) filein(x) fileout(x)
using namespace std;
const int N = 1e6 + 5, mod = 998244353;
int n, V;
int sum, ans, vis[N], f[N], bu[N], mu[N], inv[N];
vector<int> primes;
void init() {
vis[1] = mu[1] = inv[1] = 1;
for (int i = 2; i <= 1e6; i++) {
inv[i] = (mod - mod / i) * inv[mod % i] % mod;
if (not vis[i]) {
primes.push_back(i);
mu[i] = -1;
}
for (auto p : primes) {
if (i * p > 1e6) break;
vis[i * p] = 1;
if (i % p == 0) break;
mu[i * p] = -mu[i];
}
}
}
signed main() {
cin.tie(0) -> sync_with_stdio(0);
cin >> n;
init();
for (int i = 1; i <= n; i++) {
int x; cin >> x;
sum = (sum + x) % mod;
bu[x]++;
V = max(V, x);
}
for (int x = 1; x <= V; x++) {
for (int i = x; i <= V; i += x) {
f[x] = (f[x] + i * bu[i] % mod) % mod;
}
}
for (int g = 1; g <= V; g++) {
for (int d = 1; d * g <= V; d++) {
ans = (ans + mu[d] % mod * inv[g] % mod * f[d * g] % mod * f[d * g] % mod) % mod;
}
}
ans = ((ans - sum) % mod + mod) % mod * inv[2] % mod;
cout << ans;
return 0;
}
G - Incenters
Description
在平面直角坐标系内,有一以 \((0,0)\) 为圆心、以 \(1\) 为半径的 \(\odot O\)。现给定 \(\odot O\) 上的 \(n\) 个点,其中第 \(i\) 个点的坐标为 \(\Big(\cos\dfrac{2\pi T_i}{L},\sin\dfrac{2\pi T_i}{L}\Big)\)。
从这 \(n\) 个点中等概率随机选择 \(3\) 个不同的点,求这 \(3\) 个点形成的三角形的内心的坐标期望值。
\(3 \le n \le 3000,\ \epsilon \le 10^{-9}\)。
Solution
题意转化
可以看出这个期望是假的。算出所有可能的内心坐标之和,除以 \(\dbinom n3\),即构成的三角形数量,即为答案。
目标变为:给定 \(3\) 个点的坐标,求这 \(3\) 个点围成三角形的内心的坐标。
几何推导
求内心的坐标很棘手,但是我们可以做如下转化。
引理 1 如下图所示,\(\triangle ABC\)(红色)内接于 \(\odot O\),其内心为点 \(I\),连接 \(AI, BI, CI\) 并延长,分别于 \(\odot O\) 交于 \(A_1,B_1,C_1\) 三点,连接 \(A_1B_1, B_1C_1, C_1A_1\),则:点 \(I\) 为 \(\triangle A_1B_1C_1\) 的垂心。
证明:因为 \(3\) 对角平分线,加之 \(\triangle A_1B_1C_1\) 内角和为 \(\dfrac \pi 2\),所以 \(\angle BB_1A_1 + \angle CC_1B_1 + \angle ACC_1 = \dfrac \pi 4\)。即 \(\angle A_1B_1C_1 + \angle AA_1B_1 = \dfrac \pi 4\),进而 \(AA_1 \perp B_1C_1\),其余同理,得证。
引理 2 任意三角形的外心、重心、垂心三点共线,且满足外心到重心距离为垂心到重心距离的一半。
这是大名鼎鼎的“欧拉线”问题,证明较为复杂,此处略。
总的构图如下图所示,其中 \(M\) 为重心,\(I\) 为内心或垂心。
我们假定,现在已经已知 \(\triangle ABC\) 三条弧的中点构成的三角形 \(\triangle A_1B_1C_1\) 三点的坐标 \(A_1(x_1,y_1),B_1(x_2,y_2),C_1(x_3,y_3)\),那么根据向量知识,容易知道
根据欧拉线结论 \(\vec{OI} = 3\vec{OM}\),可知
现在只需计算弧中点围成三角形的内心的坐标和。
坐标计算
已知点 \(P\) 的极角为 \(\dfrac{2\pi T_P}{L}\),点 \(Q\) 的极角为 \(\dfrac{2\pi T_Q}{L}\)。
由此可知弧 \(PQ\) 的中点 \(M\) 的极角为 \(\dfrac{\pi(T_P+T_Q)}{L}\)。
考虑 \(M\) 会被纳入贡献多少次。考虑第三个点 \(R\),使得 \(\triangle PQR\) 为题中所选三角形。考虑分类讨论:
记 \(c\) 表示劣弧 \(PQ\) 上点的个数(不包括弧的端点)。
如果 \(R\) 在劣弧 \(PQ\) 上,则中点 \(M\) 应为 \(\angle PRQ\) 平分线与 \(\odot O\) 的交点,即 \(M\) 在优弧 \(PQ\) 上,\(M\) 产生 \(c\) 的贡献系数。
反之,如果 \(R\) 在劣弧 \(PQ\) 上,则中点 \(M'\) 应为 \(\angle PRQ\) 平分线与 \(\odot O\) 的交点,即 \(M'\) 在优弧 \(PQ\) 上(即是说,\(M\) 与 \(M'\) 关于原点对称),\(M'\) 产生 \(cnt-2-c\) 的贡献。
由于两点对称,所以贡献应该一正一负,即产生 \(cnt-2-2c\) 的贡献。
将这个系数乘以弧中点的坐标求和,然后除以组合数就做完了。

浙公网安备 33010602011771号