当前位置:首页 > 编程笔记 > 正文
已解决

【二分】Pythagorean Triples—CF1487D

来自网友在路上 147847提问 提问时间:2023-10-09 22:47:07阅读次数: 47

最佳答案 问答题库478位专家为你答疑解惑

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=2c1 b = c − 1 b = c - 1 b=c1

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

使用二分可以求出对应的 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

#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;
}
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"【二分】Pythagorean Triples—CF1487D":http://eshow365.cn/6-18039-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!