Partition
問題
D – Partition
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2022/4/11 解法わからず。
解法
- \(a_{1},a_{2},a_{3},…a_{N}\) は答えとなる最大公約数で割り切れるので、\(M\) もその最大公約数で割り切れなければならない。
- したがって、\(M\) の約数が答えの候補となるので、約数を列挙しておく。
- また、列挙したそれぞれの約数の倍数を \(v\) とすると、最大 \(M/v\) 個の約数を作ることができる。
- そして、列挙したそれぞれの約数の倍数 \(v\) のうち、\(N \leq M/v\) の最大値が答え。
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 60; // const int INF = 1001001001; vector<int> divisor(int N) { vector<int> res; for(int i = 1; i * i <= N; i++) { if(N % i == 0) { res.push_back(i); if(i != N / i) { res.push_back(N / i); } } } return res; } int main() { int N, M; cin >> N >> M; vector<int> d = divisor(M); sort(d.rbegin(), d.rend()); int ans = 0; int n = d.size(); rep(i, n) { int v = d[i]; if(N <= M / v) { ans = max(ans, v); } } cout << ans << endl; return 0; }