zoukankan      html  css  js  c++  java
  • 【牛客练习赛51】C

    题目大意:

    题目链接:https://ac.nowcoder.com/acm/contest/1083/C
    给出直角三角形其中一条边的长度nn,你的任务是构造剩下的两条边,使这三条边能构成一个直角三角形。


    思路:

    分类讨论。

    • 如果n2nleq 2,显然无解。
    • 如果nn是奇数,那么显然存在a=n22,b=n22+1a=lfloorfrac{n^2}{2} floor,b=lfloorfrac{n^2}{2} floor+1,这样b2a2=(b+a)(ba)=2n22+1=n2b^2-a^2=(b+a)(b-a)=2lfloorfrac{n^2}{2} floor+1=n^2。这样就构造出了一组勾股数。
    • 如果nn是偶数,那么就把nn写成k×2pk imes 2^p,其中kk为奇数。
    • 如果k>1k>1,那么就直接按照奇数的方法计算出另外两个数字,然后全部乘上2p2^p
    • 如果k=1k=1,那么nn就是2p2^p。这样的话我们就另t=n4t=frac{n}{4},显然tt不会是小数。那么利用勾股数3,4,53,4,5,答案就是3t,5t3t,5t

    好像是有通项公式的,但是我太菜了不会


    代码:

    #include <cstdio>
    using namespace std;
    typedef long long ll;
    
    int a,b;
    ll p;
    
    int main()
    {
    	scanf("%d",&a);
    	if (a==1 || a==2 || a==0)
    		return !printf("-1");
    	if (a&1)  //奇数
    		return !printf("%lld %lld",(ll)a*(ll)a/2LL,(ll)a*(ll)a/2LL+1LL);
    	for (p=1,b=a;!(b&1);b/=2,p*=2LL) ;  //计算k
    	if (b!=1)  //可以转换成某个不为1的奇数
    		printf("%lld %lld",(ll)b*(ll)b/2LL*p,((ll)b*(ll)b/2LL+1LL)*p);
    	else  //为2^t
    		printf("%lld %lld",3LL*(a/4),5LL*(a/4));
    	return 0;
    }
    
  • 相关阅读:
    Webform服务器控件调用JS
    Webfrom基础知识
    Webform用户控件
    数组练习
    整理
    SVN分支与合并
    根据经纬度,获取两点间的距离
    简单Bat文件编写
    Maven Android使用一
    Maven环境配置
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998032.html
Copyright © 2011-2022 走看看