結果
| 問題 | 
                            No.28 末尾最適化
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2023-03-30 10:05:19 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 346 ms / 5,000 ms | 
| コード長 | 1,776 bytes | 
| コンパイル時間 | 873 ms | 
| コンパイル使用メモリ | 94,504 KB | 
| 最終ジャッジ日時 | 2025-02-11 19:04:55 | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 2 | 
ソースコード
#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
int isqrt(int n) {
    int x = n;
    int y = (x + 1) / 2;
    while (y < x) {
        x = y;
        y = (x + n / x) / 2;
    }
    return x;
}
std::unordered_map<int, int> factorization(int n) {
    std::unordered_map<int, int> res;
    int tmp = n;
    const int sq_n = isqrt(n);
    for (int i = 2; i < sq_n + 1; ++i) {
        if (tmp % i == 0) {
            int cnt = 0;
            while (tmp % i == 0) {
                cnt += 1;
                tmp /= i;
            }
            res.emplace(i, cnt);
        }
    }
    if (tmp != 1) res.emplace(tmp, 1);
    if (res.empty() && n != 1) res.emplace(n, 1);
    return res;
}
int solve(int seed, int N, int K, int B) {
    std::vector<long long> X(N + 1);
    X.at(0) = seed;
    for (int i = 1; i < N + 1; ++i) {
        const auto &x = X.at(i - 1);
        X.at(i) = 1 + (x * x + x * 12345) % 100000009;
    }
    const auto f = factorization(B);
    int res = N;
    for (const auto &[k, v]: f) {
        std::vector<int> factor_count;
        for (const auto &x: X) {
            auto tmp = x;
            int cnt = 0;
            while (tmp % k == 0) {
                cnt++;
                tmp /= k;
            }
            factor_count.push_back(cnt);
        }
        std::sort(factor_count.begin(), factor_count.end());
        int cnt_sum = 0;
        for (int i = 0; i < K; ++i) {
            cnt_sum += factor_count.at(i);
        }
        if (res > (cnt_sum / v)) res = cnt_sum / v;
    }
    return res;
}
int main() {
    int Q;
    std::cin >> Q;
    for (int i = 0; i < Q; ++i) {
        int seed, N, K, B;
        std::cin >> seed >> N >> K >> B;
        std::cout << solve(seed, N, K, B) << std::endl;
    }
}