2015浙工大校賽-Problem C: 三角-(費馬大定理)
阿新 • • 發佈:2019-01-03
連結: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; } }