プロジェクトオイラー39. ~ Integer right triangles ~
No.39 Integer right triangles
問題.
において,このような直角三角形の個数が最大となる
を求めよ.
考え方とプログラム例(c++)
辺の長さが整数である直角三角形の辺の長さは,と書けます.ここで,は互いに素な整数で,一方が偶数,もう一方が奇数,
は自然数ととることで,辺の長さが整数である直角三角形は
の組と1対1に対応します.このとき,周の長さは
となります.
互いに素かどうかについては,最大公約数を求める場合と同じように再帰を使いました.
#include<bits/stdc++.h> using namespace std; int N = 1000; int coprime(int a, int b){//互いに素なら1, 互いに素でなければ0を返す if(a % b == 0){ if(b == 1) return 1; else return 0; } else return coprime(b, a % b); } int main(){ vector<int> cnt(N+1, 0); for(int m = 1; m * m < N; m++){ for(int n = 1; n < m; n++){ if((m + n) % 2 == 0 || !coprime(m, n)) continue; int p = 2 * m * (m + n); for(int k = p; k <= N; k += p) cnt[k] += 1; } } int ans = 0; for(int i = 1; i <= N; i++){ if(cnt[i] > cnt[ans]){ ans = i; } } cout << ans << endl; return 0; }
京大2022年度理系第3問
問題.
は因数分解できないので,互除法を使って考えることになります.
解説.
まず,\begin{align*}
n^4+2 &= (n^4-4)+6\\
&= (n^2+2)(n^2-2)+6\\
n^6+2 &= (n^6+8)-6\\
&= (n^2+2)(n^4-2n^2+4)-6
\end{align*}
よって,最大公約数は
と
の最大公約数に等しい.
さらに,を6で割ったときの余りを
とすると,
は
と
の最大公約数に等しい.
あとは,を6で割った余りで場合分けして調べていきます.
(i) (
は整数)と書けるとき
\begin{align*}
n^2+2 &= (6m)^2+2\\
&= 6\cdot 6m+2
\end{align*}
より,であり,
.
(ii) (
は整数)と書けるとき
\begin{align*}
n^2+2 &= (6m\pm 1)^2+2\\
&= 6(6m^2\pm 2m)+3
\end{align*}(複号同順)
より,であり,
.
(iii) (
は整数)と書けるとき
\begin{align*}
n^2+2 &= (6m\pm 2)^2+2\\
&= 6(6m^2\pm 4m+1)
\end{align*}(複号同順)
より,であり,
.
(iv) (
は整数)と書けるとき
\begin{align*}
n^2+2 &= (6m+3)^2+2\\
&= 6(6m^2+6m+1)+5
\end{align*}
より,であり,
.
したがって,(i)〜(iv)より,
を
で割った余りが0のとき
1,5のとき
2,4のとき
3のとき
追記
を6で割った余りが1, 5のとき,および2,4のときをまとめて計算していますが,これは場合分けをする前に具体的な
の値
の場合を計算してみることで,まとめて扱ってよいかどうかを判断できます.