#include<bits/stdc++.h>usingnamespace std;int main(){int n, k;
cin >> n >> k;
vector<int> a(n);for(int i =0; i < n; i++){
cin >> a[i];}int ans =0;for(int i =0; i < n; i++){for(int j = i +1; j < n; j++){if(a[i]* a[j]>= k){
ans++;}}}
cout << ans << endl;return0;}
ありうるiとjを全て列挙してkより大きいか判定しています。
j = i + 1としていますが、これはi<jとすることで(1,2)と(2,1)といったiとjの重複を避けるためです。
if (i >= j) continue;でも可能です。
また、a[i] * a[j]のオーバーフローに注意してください。
この時間計算量は、二重forの影響でO(N2)です。
そのため、2≤N≤103が限度でしょう。
もし2≤N≤105となっていたらこの解法ではTLEしてしまうため、別の解法を考える必要があります
(Aをあらかじめソートしておいてk/a[i]を二分探索(後章)すればO(N log N)で可能です)。
#include<bits/stdc++.h>usingnamespace std;int main(){int n;
cin >> n;int ans =0;for(int x =0; x * x <= n; x++){for(int y = x +1; y * y <= n; y++){if(x * x + y * y == n){
ans++;}}}
cout << ans << endl;return0;}
for文の終了条件がx * x <= nと、少し見慣れない形式かもしれませんが、
これはx <= sqrt(n)とほぼ同義です。「ほぼ」というのは、sqrt関数は返り値がdouble型であり、誤差が生じてしまいます。
例えば5≤√25は真ですが、もしsqrt(25)で誤差が生じて4.9999999999となってしまったら偽になってしまいます(実際に誤った判定をするのはnがもっと大きいときです)。
しかし、5*5≤25と判定すれば誤差は生じません。 そのため、このコードではx * x <= nを採用しています。