公式

A - Shuffled Equation 解説 by physics0523


初心者の方へ

解法1: 並べ替えを全て試す

\(A\) の並べ替えを全て試すことで、この問題に正解できます。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  vector<int> a(3);
  cin >> a[0] >> a[1] >> a[2];
  if(a[0]*a[1]==a[2]){cout << "Yes\n"; return 0;}
  if(a[0]*a[2]==a[1]){cout << "Yes\n"; return 0;}
  if(a[1]*a[0]==a[2]){cout << "Yes\n"; return 0;}
  if(a[1]*a[2]==a[0]){cout << "Yes\n"; return 0;}
  if(a[2]*a[0]==a[1]){cout << "Yes\n"; return 0;}
  if(a[2]*a[1]==a[0]){cout << "Yes\n"; return 0;}
  cout << "No\n";
  return 0;
}

C++ の場合、並べ替えを全て試すために next_permutation という機能を利用することも出来ます。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  vector<int> a(3);
  cin >> a[0] >> a[1] >> a[2];
  sort(a.begin(),a.end());
  do{
    if(a[0]*a[1]==a[2]){cout << "Yes\n"; return 0;}
  }while(next_permutation(a.begin(),a.end()));
  cout << "No\n";
  return 0;
}

解法2: 交換法則を利用する

整数 \(A,B\) について \(A \times B = B \times A\) が成り立つので、例えば a[0]*a[1]==a[2]a[1]*a[0]==a[2] は同じ判定をしていることになります。
このことで、場合分けを \(3\) 通りに減らすことができます。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  vector<int> a(3);
  cin >> a[0] >> a[1] >> a[2];
  if(a[0]*a[1]==a[2]){cout << "Yes\n"; return 0;}
  if(a[1]*a[2]==a[0]){cout << "Yes\n"; return 0;}
  if(a[2]*a[0]==a[1]){cout << "Yes\n"; return 0;}
  cout << "No\n";
  return 0;
}

解法3: 大小関係を利用する

整数 \(A,B,C \ge 1\) に関して \(A \times B = C\) が成り立つとき、 \(A \le C\) かつ \(B \le C\) が成り立ちます。
なので、答えが Yes であるなら\(A\) を昇順に並べた列について \(A_1 \times A_2 = A_3\) が成り立つことが示せます。
よって、 \(A\) を昇順ソートした後 \(1\) 通りだけ判定すればよいです。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  vector<int> a(3);
  cin >> a[0] >> a[1] >> a[2];
  sort(a.begin(),a.end());
  if(a[0]*a[1]==a[2]){cout << "Yes\n"; return 0;}
  cout << "No\n";
  return 0;
}

投稿日時:
最終更新: