結果
| 問題 |
No.811 約数の個数の最大化
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-04-12 23:12:05 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 23 ms / 2,000 ms |
| コード長 | 1,815 bytes |
| コンパイル時間 | 2,034 ms |
| コンパイル使用メモリ | 180,148 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-15 06:16:21 |
| 合計ジャッジ時間 | 2,609 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int cnt[100010];
bool jg[100010];
vector<int> p;
void judge_search(long long cur, long long curi, long long c, vector<pair<long long, int>> &v, long long k) {
jg[cur] = (c >= k);
if (curi == v.size()) return;
for (int i = 0; i <= v[curi].second; i++) {
judge_search(cur, curi+1, c+i, v, k);
cur *= v[curi].first;
}
}
void judge(long long n, long long k) {
map<long long, int> m;
for (long long i = 2; i * i <= n; i++) {
while (n % i == 0) {
m[i]++; n /= i;
}
}
if (n != 1) m[n]++;
vector<pair<long long, int>> v;
for (auto it: m) {
v.emplace_back(it);
}
judge_search(1, 0, 0, v, k);
}
void search(long long cur, long long curi, long long num) {
cnt[cur] = num;
if (curi == p.size()) return;
if (p[curi] * cur > 100000) return;
long long next = cur; long long u = 0;
while (next <= 100000) {
search(next, curi+1, num*(u+1));
next *= p[curi]; u++;
}
}
vector<bool> Eratosthenes(int n){
vector<bool> prime(n+1, true);
if(n >= 0) prime[0] = false;
if(n >= 1) prime[1] = false;
for(int i = 2; i * i <= n; i++){
if(prime[i]){
for(int j = i + i; j <= n; j += i) prime[j] = false;
}
}
return prime;
}
long long gcd(long long a, long long b) {
if (a % b == 0) return b;
else return gcd(b, a % b);
}
int main() {
auto b = Eratosthenes(100000);
for (int i = 0; i <= b.size(); i++) if (b[i]) p.emplace_back(i);
search(1, 0, 1);
long long n, k; cin >> n >> k;
judge(n, k);
long long best = 0; long long ans = 0;
for (long long i = 1; i < n; i++) {
if (jg[gcd(i, n)] && best < cnt[i]) {
best = cnt[i]; ans = i;
}
}
cout << ans << endl;
return 0;
}