题解 CF1996D Fun

lstylus / 2024-10-11 / 原文

\(\texttt{Describe}\)

给定两个整数 \(n,x\),求满足 \(ab+bc+ac \le n\)\(a+b+c\le x\)正整数三元组 \((a,b,c)\) 的个数。

\(\texttt{Solution}\)

首先考虑暴力:枚举 \(a,b\),可推出 \(c\) 的取值范围:

  • 对于 \(ab+bc+ac \le n\),我们稍微变形:\((a+b)c \le n - a \times b\),左右除 \((a+b)\)\(c \le \frac{n-a \times b}{a+b}\)

  • 对于 \(a+b+c \le x\),变形得:\(c \le x - a - b\)

根据不等式的性质(同大取大,同小取小):\(1 \le c \le \min(x-a-b,\frac{n-a \times b}{a+b})\)

算下复杂度发现:\(b \le \min(x-a,\frac{n}{a})\),是能过的。

\(\texttt{Code}\)

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e5 + 10;

int n, x;

void solve() {
	ll ans = 0;
	cin >> n >> x;
	for (int a = 1; a <= x; ++a) {
		for (int b = 1; a + b <= x && 1ll * a * b <= n; ++b) {
			ans += min(x - a - b, (n - a * b) / (a + b));
		}
	}
	cout << ans << endl;
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
	
	int T; cin >> T; while (T --) solve();
	return 0;
}