【二分】Pythagorean Triples—CF1487D

Pythagorean Triples---CF1487D

思路

联立 a 2 = b + c 2 a^2 = b + c^2 a2=b+c2、 a 2 + b 2 = c 2 a^2 + b^2 = c^2 a2+b2=c2 得:
a 2 = 2 ∗ c − 1 a^2 = 2 * c - 1 a2=2∗c−1、 b = c − 1 b = c - 1 b=c−1。

对于一个固定的 a a a, b b b、 c c c 的值都是固定的,只要满足 a ≤ b a\le b a≤b 和 c ≤ n c\le n c≤n 即可。

使用二分可以求出对应的 c c c 的值满足条件的 a a a 的取值范围,另外要排除 a = 1 , 2 a = 1, 2 a=1,2 这两个值,因为这时候 a > b a > b a>b。

C o d e Code Code

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 2e5 + 10;

int n;

// c的值是否符合条件(先不考虑奇数这个条件)
int judge(int a) {
	if ((a * a + 1) / 2 <= n
		&& a <=(a * a + 1) / 2 - 1) {
		return 1;
	}
	return 0;
}

void solve() {
	cin >> n;
	cout << "       ";
	
	if (n <= 2) {
		cout << 0 << "\n";
		return;
	}
	
	// 二分求a的最大值(先不考虑得到的c是否是整数)
	int l = 3, r = n;
	while (l < r) {
		int mid = (l + r + 1) / 2;
		if (judge(mid)) {
			l = mid;
		} else {
			r = mid - 1;
		}
	}
	if (l % 2 == 0) {
		l --;
	}
	
	// 现在满足条件的a的取值范围是[3, l]中的所有奇数
	if (judge(l)) {
		cout << l / 2 << "\n";
	} else {
		cout << "0\n";
	}
}

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T = 1;
	cin >> T; cin.get();
	while (T --) solve();
	return 0;
}
相关推荐
hold?fish:palm5 分钟前
redis中AOF 重写机制解析
数据库·c++·redis
阿米亚波15 分钟前
【C++ 异常处理】try-catch
开发语言·c++·笔记·try-catch
白狐_79819 分钟前
408数据结构第6章:迪杰斯特拉(Dijkstra)算法——真题精讲
数据结构·算法
旖旎夜光24 分钟前
C++(内存管理)
开发语言·c++·学习
皓月斯语25 分钟前
P2858 [USACO06FEB] Treats for the Cows G/S
数据结构·c++·算法·动态规划
旖旎夜光34 分钟前
LeetCode 397:整数替换(贪心问题) —— 题解
数据结构·c++·算法·leetcode·贪心算法
奈斯先生Vector37 分钟前
2026 开发者效能革命:基于创源AIGC 与开源生态的工程化实践、安全沙箱与代码智能体协同
人工智能·算法·架构·prompt·aigc
别动我齐刘海1 小时前
“三层同步审计”判定掉帧缺失
c语言·c++·人工智能·深度学习·学习·机器学习·机器人
Sagittarius_A*1 小时前
哈希与认证基础(一):哈希函数的安全目标:原像、第二原像与碰撞
算法·安全·信息安全·密码学·哈希算法
坚持编程的菜鸟2 小时前
模拟实现strncat
c语言·算法·模拟实现strncat