1. 程式人生 > >2015浙工大校賽-Problem C: 三角-(費馬大定理)

2015浙工大校賽-Problem C: 三角-(費馬大定理)

連結:http://acm.zjut.edu.cn/onlinejudge/problem.php?cid=1101&pid=2

題面:

Problem C: 三角

Time Limit: 1 Sec  Memory Limit: 32 MB
Submit: 375  Solved: 56
[Submit][Status][Web Board]

Description

有個直角三角形三邊為A,B,C三個整數。已知C為最長邊。現告訴你A的長度,求一組B,C,使得B和C最接近

Input

單行輸入一個整數2 < A < 100000000,直到檔案結束(組數小於10000)

Output

單行輸出一個整數B C

Sample Input

3

Sample Output

4 5

法一:

費馬大定理:平方整數解a^2+b^2=c^2的a值奇偶數列法則可知。

當a為奇數時,

a=2n+1

c=n^2+(n+1)^2

b=c-1

當a為偶數時,

a=2n-2,

c=1+(n-1)^2

b=c-2

法二:

找規律,根據法一的結果,可能多試幾組就能發現規律,不過還是要夠膽量猜才行。

a為奇數時c-b=1,偶數時c-b=2。

法三:

這是我自己在做的時候的思路。

設b為x,c就等於sqrt(a^2+x^2),求(c-b)min,很直接的求了導,發現小於0。那就納悶了,那不是無限嘛,一直懷疑自己求錯了,可是求了好多遍,都是小於0。但也不是所有都可以,必須是整數解,苦惱了好久,wa了好幾次。突然靈機一動,既然是要求最小差,那就從小到大列舉最小差,不就好了嘛!

設差值為x,那麼c為b+x,a^2+b^2=(b+x)^2,化簡後得到2b=(a^2-x^2)/x,只要可以整除此時的x即為最小差值,求出相應的b、c即可。

收穫:

雖然是道簡單題,但還是說明了轉換思維的重要性,為什麼一定要列舉b,不直接列舉差值呢!

程式碼:

#include <iostream> 
#include <cstring> 
#include <cstdio> 
#include <string> 
#include <iomanip> 
#include <vector> 
#include <map> 
#include <set> 
#include <algorithm> 
#include <queue> 
#include <cmath> 
using namespace std; 
  
int main() 
{ 
	long long int a,b,c;
	while(cin>>a)
	{
		for(long long int i=1;;i++)
		{
			if((a*a-i*i)%(2*i)==0)
			{
				b=(a*a-i*i)/(2*i);
				c=b+i;
				break;
			}
		}
		cout<<b<<" "<<c<<endl;
	}
}