AtCoder 勉強記録[C++] その9

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - Get Closer
[B - Get Closer](https://atcoder.jp/contests/abc246/tasks/abc246_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll a, b;
  cin >> a >> b;
  double da = a;
  double db = b;
  double d = a*a + b*b;
  d = sqrt(d);
  double resx = da/d, resy = db/d;
  cout << fixed << setprecision(12);
  cout << resx << " " << resy << endl;
}
```
### 解法
(0,0)から(A,B)までの距離dとすると(A/d,B/d)が解答となるので、計算して出力する。
## B - Unique Nicknames
[B - Unique Nicknames](https://atcoder.jp/contests/abc247/tasks/abc247_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<string>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  vec s(n), t(n);
  bool juds = true, judt = true;
  rep(i, n) cin >> s[i] >> t[i];
  for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++){
      if(i == j) continue;
      string a = s[i];
      if(a == s[j] || a == t[j]) juds = false;
      a = t[i];
      if(a == s[j] || a == t[j]) judt = false;
    }
    if(!juds&&!judt) {
      cout << "No" << endl;
      exit(0);
    }
    juds = true;
    judt = true;
  }
  cout << "Yes" << endl;
}
```
### 解法
苗字か名前をあだ名としたとき、他の人の姓名と一致しているかどうかを確認する。あだ名が苗字の場合も名前の場合でも他の人の姓名と一致した場合Noを出力し、一致しなかった場合Yesを出力する。
## B - Slimes
[B - Slimes](https://atcoder.jp/contests/abc248/tasks/abc248_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll a, b, k;
  cin >> a >> b >> k;
  ll res = 0;
  while(a < b) {
    a *= k;
    res++;
  }
  cout << res << endl;
}
```
### 解法
AがBより大きくなるまでKをかけ続け、かけた回数をカウントして出力する。
## C - Counting 2
[C - Counting 2](https://atcoder.jp/contests/abc231/tasks/abc231_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n, q, w;
  cin >> n >> q;
  vec a(n);
  rep(i, n) cin >> a[i];
  sort(a.begin(), a.end());
  for(int i = 0; i < q; i++){
    cin >> w;
    auto res = lower_bound(a.begin(), a.end(), w);
    cout << a.end() - res << endl;
  }
}
```
### 解法
2重ループで解こうとすると計算量オーバーしてしまうため、二分探索を利用する。標準ライブラリで提供されているlower_boundを利用して、身長がx以上となる最小のiを求めることで結果が得られる。
## C - Happy New Year!
[C - Happy New Year!](https://atcoder.jp/contests/abc234/tasks/abc234_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll k;
  cin >> k;
  string tmp;
  while(k > 0){
    tmp += '0'+ (k%2);
    k = k/2;
  }
  reverse(tmp.begin(), tmp.end());
  string res;
  for(ll i = 0; i < tmp.size(); i++){
    if(tmp[i] == '1') res += '2';
    else res += '0';
  }
  cout << res << endl;
}
```
### 解法
0と2のみからなる正整数のうちK番目に小さいものを考えると、Kを二進表記した数の1を2に変えたものと同じになる。よって、Kを二進表記した文字列を作り、その文字列の1をすべて2に変更することで結果が得られる。