2018 CCPC 中国大学生程序设计竞赛-网络选拔赛 1004(D题 )Find Integer

就是给你n,a求出一组b,c满足a ^ n + b ^ n = c ^ n

由于费马大定理得:当n> 2时,此方程式无解,

然后观察 当n = 0时,显然无解,

所以我们只需要讨论n = 1和n = 2的情况,  

n = 1的时,随便写个答案就行了,

n = 2的时,这里需要运用到勾股定理的一点技巧:

1,当a为大于1的奇数2n + 1时,b = 2 * n ^ 2 + 2 * n,c = 2 * n ^ 2 + 2 * n + 1. 
实际上就是把a的平方数拆成两个连续自然数,例如: 
n = 1时(a,b,c)=(3,4,5) 
n = 2时(a,b,c)=(5,12,13) 
n = 3时( a,b,c)=(7,24,25) 
...... 
这是最经典的一个套路,而且由于两个连续自然数必然互质,所以用这个套路得到的勾股数组全部都是互质的 
.2,当a为大于4的偶数2n时,b = n ^ 2-1,c = n ^ 2 + 1 
也就是把a的一半的平方分别减1和加1,例如: 
n = 3时(a,b,c)=(6,8,10) 
n = 4时(a,b,c)=(8,15,17) 
n = 5时(a,b,c)=(10 ,24,26) 
n = 6时(a,b,c)=(12,35,37) 
......

 所以n = 2的时,用公式就可以得出结果了,这样就不存在超时的问题了。

扫描二维码关注公众号,回复: 3127925 查看本文章
#include<stdio.h>
#include<math.h>

int main()
{
	long long n,m,j,k,i,T,a,b,c;
	scanf("%lld",&T);
	while (T--)
	{
		scanf("%lld%lld",&n,&a);
		if (n>2 || n==0)
		{                                      
			printf("-1 -1\n");        
		}   
		else if (n==1)           
		{
			printf("1 %lld\n",a+1);
		}
		else if (n==2)
		{
			bool flag=0;
			if (a%2!=0)
			{
				long long x = (a-1)/2;
				long long b = 2*x*x+2*x;
				long long c = 2*x*x+2*x+1;
				printf("%lld %lld\n",b,c);
				flag=1;
			}
			
			else if (a%2==0)
			{
				long long x = a/2;
				long long b = x*x-1;
				long long c = x*x+1;
				printf("%lld %lld\n",b,c);
				flag=1;
			} 
			if (flag==0)
			printf("-1 -1\n");
				
		}
			
	}
	return 0;
}




猜你喜欢

转载自blog.csdn.net/qq_40763929/article/details/82053626