[CodeForces-707C] Pythagorean Triples【构造right三角形】

2024-02-09 00:20

本文主要是介绍[CodeForces-707C] Pythagorean Triples【构造right三角形】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:

  • 给出一个整形范围内的数n,判断是不是可以作为一个直角三角形的边,直角边斜边都可以. 另外,必须保证另外两条边是整数。

思路:

对于相邻平方差,我们可以得到{1, 3, 5, 7, ...}这样一个奇数数列。

1 = 1^2 - 0^2

3 = 2^2 - 1^2

5 = 3^2 - 2^2

……

由此可以得出,一个奇数n,有:n = (n / 2 + 1)^2 - (n / 2)^2

勾股定理大家一定知道!再接下来,我们考虑

(1)假设tmp = n^2,不是2的次幂. 那么tmp一直除以2,一定会得到一个奇数odd。

  1. 由上所述,我们可以知道:对于最后这个奇数来说,我们一定可以得到平方差相减的也就是odd = (odd / 2 + 1)^2 - (odd / 2 )^2
  2. 得到奇数的过程中,我们除以掉了一个2的次幂数,我们假设这个次幂是k。
  3. 所以如果k是偶数,那么2^{k}=(2^{k/2})^{2}.  于是我们可以得到n^2 = (odd / 2 + 1 + 2^{k/2})^2 - (odd / 2 + 2^{k/2})^2
  4. 如果k是奇数,那么是不可以构成满足条件的三角形的

(2)假设tmp = n ^ 2是2的次幂

那由边长n构成的直角三角形一定是和345成比例的

(3)特殊考虑n为1和2的情况,是不能构成满足条件的三角形的


关于如何判断一个数是不是2的整数次幂 

  • 我们知道2的整数次幂除了最高位为1,其余都为0. 所以假设n是2的整数次幂,那么n & (n - 1) == 0

 CODE

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;typedef long long ll;inline ll read()
{ll x = 0, f = 1; char c = getchar();while(c < '0' || c > '9') { if(c == '-') f = -f; c = getchar(); }while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }return x * f;
}const int maxN = 100005;ll n;int main()
{n = read();ll tmp = n * n;if(n == 1 || n == 2)cout << "-1\n";else if(! (n & (n - 1)))cout << n / 4 * 3 << " " << n / 4 * 5 << "\n";else{int mi = 0;while(!(tmp & 1)){tmp /= 2;mi ++;}if(mi & 1)cout << "-1\n";elsecout << (tmp / 2) * (1 << (mi / 2)) << ' ' << (tmp / 2 + 1) * (1 << (mi / 2)) << '\n';}return 0;
}

 

这篇关于[CodeForces-707C] Pythagorean Triples【构造right三角形】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/692637

相关文章

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

C++中类的构造函数调用顺序

当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的 构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。 简而言之,对象是由“底层向上”开始构造的。因为,构造函数一开始构造时,总是 要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时, 如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。

Codeforces Round 971 (Div. 4) (A~G1)

A、B题太简单,不做解释 C 对于 x y 两个方向,每一个方向至少需要 x / k 向上取整的步数,取最大值。 由于 x 方向先移动,假如 x 方向需要的步数多于 y 方向的步数,那么最后 y 方向的那一步就不需要了,答案减 1 代码 #include <iostream>#include <algorithm>#include <vector>#include <string>