公式
A - Shuffled Equation 解説
by
A - Shuffled Equation 解説
by
physics0523
初心者の方へ
- プログラミングの学習を始めたばかりで何から手をつけるべきかわからない方は、まずは practice contest の問題A「Welcome to AtCoder」をお試しください。言語ごとに解答例が掲載されています。
- また、プログラミングコンテストの問題に慣れていない方は、 AtCoder Beginners Selection の問題をいくつか試すことをおすすめします。
- C++入門 AtCoder Programming Guide for beginners (APG4b) は、競技プログラミングのための C++ 入門用コンテンツです。
- Python入門 AtCoder Programming Guide for beginners (APG4bPython) は、競技プログラミングのための Python 入門用コンテンツです。
解法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;
}
投稿日時:
最終更新:
