P10532 [XJTUPC2024] 篩法 題解

Rainsheep發表於2024-10-19

打表可知答案為 \(n^2\)

一種幾何證明,方法來自於講評。

考慮把 \(n^2\) 個整點放到座標系中,滿足 \((x, y)(x \le n, y \le n)\)

現在從原點向每個滿足 \((x, y)(x \perp y)\) 的點引出一條射線,顯然每個點都會唯一的被一條射線覆蓋到,因為 \((\dfrac{x}{\gcd(x, y)}, \dfrac{y}{\gcd(x, y)})\) 被射線經過,而二者又在一條直線上。

對於每個引出射線的 \((x, y)(x \perp y)\),考慮這條線覆蓋的點數,發現恰好就是 \(\left \lfloor \dfrac{n}{\max(i, j)} \right \rfloor\),因為當 \(k > \left \lfloor \dfrac{n}{\max(i, j)} \right \rfloor\) 時,\((xk, yk)\) 必然其一大於 \(n\)

\(\displaystyle\sum\limits_{i=1}^n\sum\limits_{j=1}^n\lfloor \dfrac{n}{\max(i,j)}\rfloor [i \perp j]\) 可以理解為,引出的若干條射線所覆蓋到的點數,因為點數為 \(n^2\),所以答案也為 \(n^2\)

// 如果命運對你緘默, 那就活給他看。
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast", "inline", "-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include <bits/stdc++.h>
using namespace std;
typedef long long LL; 
// #define int LL
signed main() {
	// freopen(".in", "r", stdin);
	// freopen(".out", "w", stdout);
	ios :: sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int n;
	cin >> n;
	cout << 1LL * n * n << '\n';
	return 0;
}

相關文章