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\n",1+a);
13         else
14         {
15             wu = a;
16             if(a%4==0)
17             {
18                 p = a/4;
19                 printf("%I64d %I64d\n",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\n",(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 才能过......

posted @ 2018-08-25 19:09  Taskr  阅读(442)  评论(0编辑  收藏  举报
Live2D