已知直角三角形周長求可能的三角形個數

  沒想到我又開始寫博客了,嘿嘿,逛論壇時一個大一小萌新問問題恰好看到,題目雖然簡單但還挺有意思的,若是去年看到確定給新生加到acm訓練題裏,惋惜沒機會了。ios

  題目給出直角三角形周長,問有多少種知足條件的三角形,學過c語言循環的都能兩重循環直接爆出來,可是這道題卡的是時間,1s最高一萬的測試數據,每一個數據最大10萬,保險起見覆雜度應該降到O(n)。算法

  思路寫到代碼裏了,主要利用一些數學關係優化,算法題仍是很好玩,之後抽時間作一些leetcode之類的題,順便水博客了。測試

代碼以下:優化

 1 #include <cstdio>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     //freopen("out.txt", "w", stdout);
 9     int T;
10     cin >> T;
11     while(T--) {
12         long long m;
13         cin >> m;
14         
15         //直角三角形三邊關係,短直角邊長度必定小於1/3,能夠約束的更狠一點,爲了方便我就取1/3了
16         long long maxa = m / 3; 
17         
18         long long ans = 0;
19         for(long long a = 1; a <= maxa; ++a) {
20             if(a * a % (m - a) != 0)    //數學關係,a * a = (c + b) * (c - b)
21                 continue;
22             long long b = (m - a - a * a / (m - a)) / 2;    //數學關係,已知c + b 和 c - b,很容易求出來c 和 b
23             long long c = m - a - b;
24             //cout << a << ' ' << b << ' ' << c << endl;
25             if(c - a < b && c - b < a && a <= b && a * a + b * b == c * c)  //判斷一下是否不合法或者重複
26                 ++ans;
27         }
28         cout << ans << endl;
29     }
30     return 0;
31 }
相關文章
相關標籤/搜索