結果
| 問題 | No.28 末尾最適化 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-10-17 15:43:02 |
| 言語 | C++23(gcc16) (gcc 16.2.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 153 ms / 5,000 ms |
| + 548µs | |
| コード長 | 1,396 bytes |
| 記録 | |
| コンパイル時間 | 2,503 ms |
| コンパイル使用メモリ | 188,136 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2026-10-17 15:43:06 |
| 合計ジャッジ時間 | 3,718 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge5_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 3 |
ソースコード
#include <algorithm>
#include <iostream>
#include <utility>
#include <vector>
std::vector<std::pair<int, int>> prime_factorize(int n) {
std::vector<std::pair<int, int>> res;
std::vector<int> primes = {2, 3, 5, 7};
for (int p : primes) {
int e = 0;
while (n % p == 0) {
n /= p;
e++;
}
if (e > 0) { res.emplace_back(p, e); }
}
if (n > 1) { res.emplace_back(n, 1); }
return res;
}
void solve() {
using namespace std;
constexpr long long MOD = 100000009;
long long seed;
int n, k, base;
cin >> seed >> n >> k >> base;
vector<long long> x(n + 1, seed);
for (int i = 0; i < n; i++) {
x[i + 1] = (x[i] * (x[i] + 12345) % MOD) + 1;
}
auto primes = prime_factorize(base);
int ans = n * 100;
for (auto [p, e] : primes) {
vector<int> count;
for (auto xi : x) {
int c = 0;
while (xi % p == 0) {
xi /= p;
c++;
}
count.push_back(c);
}
sort(count.begin(), count.end());
int mul_cnt = 0;
for (int i = 0; i < k; i++) { mul_cnt += count[i]; }
ans = min(ans, mul_cnt / e);
}
cout << ans << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int q;
std::cin >> q;
while (q--) { solve(); }
}