Official
C - チーム分けくじ引き / Team Assignment Lottery Editorial
by
C - チーム分けくじ引き / Team Assignment Lottery Editorial
by
physics0523
求める確率が \(p/q\) であるとすると、
- \(p = \) (\(i=2,3,\dots,N\) のうち、 \(S_1 \neq S_i\) であるものの個数)
- \(q = N-1\)
となります。これは容易に求めることができます。
しかし、本問題では答えとして 既約分数 を出力する必要があります。つまり、約分をする必要があります。
約分のやり方として、 \(g=\gcd(p,q)\) ( \(\gcd\) は最大公約数) として、 \(p,q\) をともに \(g\) で割るという方法があります。こうすることで、分母分子をともに割り切る \(2\) 以上の整数が存在しなくなり、約分が完了します。
一部の言語では \(\gcd\) が標準で実装されているので、利用するとよいでしょう。
この解法は \(0/1\) あるいは \(1/1\) でもうまく動作します。
本解法の時間計算量は \(O(N)\) です。
実装例 (C++):
#include<bits/stdc++.h>
using namespace std;
int main(){
int N;
cin >> N;
vector<string> S(N);
cin >> S[0];
int p=0,q=(N-1);
for(int i=1;i<N;i++){
cin >> S[i];
if(S[0]!=S[i]){p++;}
}
int g=gcd(p,q);
cout << p/g << "/" << q/g << "\n";
return 0;
}
