難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Closest Multiplicative Disassembly

作成者 kammyu

難易度(作成者設定) Lv.2

難易度(投票) 未投票 (0票)

実行時間制限
2 秒
メモリ制限
512 MiB

ab=Nab=N を b=Nab=\frac Na と変形することで aa から bb が一意に定まることが分かります。
よって、答えとなる aa を探すことを考えます。

a2≤ab=Na^2\le ab=N より、aa が正整数であることも併せて 1≤a2≤N1\le a^2\le N の範囲を探索すればいいことが分かります。

後はある aa について、b=Nab=\frac Na が正整数になればよいです。つまり aa が NN を割り切るかどうかを判定すればいいです。

以上を適切に実装することで、本問題を O(N)O(\sqrt N) で解くことができました。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main()
{
  long long N;
  cin >> N;

  long long a = 1, A;
  while (a * a <= N)
  {
    if (N % a == 0)
      A = a;
    a++;
  }
  cout << A << " " << N / A << endl;
}

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。