zoukankan      html  css  js  c++  java
  • hdu 6441 (费马大定理+勾股数 数学)

    题意是给定 n 和 a,问是否存在正整数 b,c 满足:a^b^== c^n.输出 b  c,若不存在满足条件的 b,c,输出 -1 -1。

    当 n > 2 时,由费马大定理,不存在正整数 a,b,c 满足 a^n + b^== c^n ,也就是说当 n 大于 2 时,只能输出 -1 -1 。接下来问题就可以变成 n 分别取 0,1,2 的情况了。

    当 n == 1 时,由于只要输出任意一组合理解即可,则 b 为 1 ,c 为 a + 1 即可。

    当 n == 0 时,条件变成了 1 + 1 == 1,无法满足,输出 -1 -1.

    当 n == 2 时,条件变成了 a^2 b^== c^2 也就是在已知 一个勾股数的情况下,求其他两个勾股数。

    勾股数:2 * k + 1,2 * k * ( k + 1 ),2 * k * ( k + 1 ) + 1( k 为正整数 )

    当 a 为奇数时,则 a = 2 * k + 1 ,解得 k 的值,则 b = 2 * k * ( k + 1 ),c = 2 * k * ( k + 1 ) + 1;

    当 a 为偶数时,则 a 可能等于 p * ( 2 * k + 1 ),也可能等于 2 * k * ( k + 1 ) ,

    检查 a 是否可以被 4 整除,若能,则属于后一种情况,p = a / 4,那么 b = p * 3,c = p * 5;(此处算 k 太麻烦,直接用 3,4,5 这组勾股数及其倍数)

    若 a 不能被 4 整除,令 a 不断除以 2 ,若在 a 变成 1 之前,a 可以为奇数,那么就属于前一种情况,即 a = p * ( 2 * k + 1 ) ,p = a / a'( a' 即为 a 多次除以 2 变成的非 1 奇数,所以在除以 2 之前要把 a 的值赋给一个变量),求出 k 的值,

    则 b =( 2 * k * ( k + 1 ) ) *  p ,c = ( 2 * k * ( k + 1 ) + 1) * p;

    若上述情况都得不到 b,c,则输出 -1 -1 即可。

    代码如下:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 __int64 p,a,n,wu;
     4 int main()
     5 {
     6     int t;
     7     scanf("%d",&t);
     8     while(t--)
     9     {
    10         scanf("%I64d%I64d",&n,&a);
    11         if(n>2||n==0) puts("-1 -1");
    12         else if(n==1) printf("1 %I64d
    ",1+a);
    13         else
    14         {
    15             wu = a;
    16             if(a%4==0)
    17             {
    18                 p = a/4;
    19                 printf("%I64d %I64d
    ",p*3,p*5);
    20                 wu = 0;
    21             }
    22             else
    23             {
    24                 while(!(wu&1)) wu>>=1;// 当a是偶数时不断除以2
    25                 if(wu==1) puts("-1 -1");
    26                 else
    27                 {
    28                     p = a / wu;
    29                     wu = (wu-1)>>1;
    30                     printf("%I64d %I64d
    ",(wu*wu*2+wu*2)*p,(wu*wu*2+wu*2+1)*p);
    31                 }
    32             }
    33         }
    34     }
    35     return 0;
    36 }
    View Code

     这题在 vjudge 上用 int 能过,但在 hdu 上会 wa,要换成 long long 才能过......

    日后若能有更好的想法,再来完善。 希望看到的大神不吝赐教 orz
  • 相关阅读:
    Metasploit advanced命令使用技巧
    Metasploit命令info使用技巧
    Kali Linux 2020.1b发布了
    设置USB无线网卡为监听模式大学霸IT达人
    解决ifconfig命令未找到
    Metasploit新增技巧提示功能
    Wireshark运算符!=无法正常工作
    解决Kali Linux XFCE桌面Tab无法补全
    Nessus更新到8.9.1
    ASP入门(七)-Response小案例
  • 原文地址:https://www.cnblogs.com/Taskr212/p/9535035.html
Copyright © 2011-2022 走看看