結果

問題 No.458 異なる素数の和
ユーザー kabbo ghoshkabbo ghosh
提出日時 2021-08-04 13:49:46
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 1,610 ms / 2,000 ms
コード長 2,988 bytes
コンパイル時間 3,553 ms
コンパイル使用メモリ 207,776 KB
実行使用メモリ 180,668 KB
最終ジャッジ日時 2023-10-14 21:21:48
合計ジャッジ時間 18,739 ms
ジャッジサーバーID
(参考情報)
judge11 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 146 ms
180,608 KB
testcase_01 AC 737 ms
180,420 KB
testcase_02 AC 876 ms
180,364 KB
testcase_03 AC 367 ms
180,496 KB
testcase_04 AC 402 ms
180,440 KB
testcase_05 AC 1,397 ms
180,436 KB
testcase_06 AC 814 ms
180,612 KB
testcase_07 AC 163 ms
180,368 KB
testcase_08 AC 1,401 ms
180,520 KB
testcase_09 AC 250 ms
180,380 KB
testcase_10 AC 132 ms
180,524 KB
testcase_11 AC 1,585 ms
180,376 KB
testcase_12 AC 133 ms
180,484 KB
testcase_13 AC 132 ms
180,416 KB
testcase_14 AC 133 ms
180,668 KB
testcase_15 AC 134 ms
180,368 KB
testcase_16 AC 305 ms
180,356 KB
testcase_17 AC 136 ms
180,480 KB
testcase_18 AC 136 ms
180,580 KB
testcase_19 AC 133 ms
180,424 KB
testcase_20 AC 136 ms
180,464 KB
testcase_21 AC 134 ms
180,528 KB
testcase_22 AC 135 ms
180,372 KB
testcase_23 AC 137 ms
180,524 KB
testcase_24 AC 135 ms
180,472 KB
testcase_25 AC 133 ms
180,504 KB
testcase_26 AC 135 ms
180,440 KB
testcase_27 AC 801 ms
180,540 KB
testcase_28 AC 1,610 ms
180,380 KB
testcase_29 AC 211 ms
180,352 KB
testcase_30 AC 618 ms
180,536 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

/*
* @Author: kabbo
* @Date:   2020-06-24 08:40:07
* @Last Modified by:   kabbo
* @Last Modified time: 2020-06-24 08:49:58
*/
#include <bits/stdc++.h>
using namespace std;
#define pii pair<long long, long long>
#define endl '\n'
#define ull unsigned long long
#define ll int64_t
#define ar array
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0200r0.html
template <class Fun>
class y_combinator_result
{
    Fun fun_;

public:
    template <class T>
    explicit y_combinator_result(T &&fun) : fun_(std::forward<T>(fun)) {}

    template <class... Args>
    decltype(auto) operator()(Args &&...args)
    {
        return fun_(std::ref(*this), std::forward<Args>(args)...);
    }
};

template <class Fun>
decltype(auto) y_combinator(Fun &&fun)
{
    return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun));
}
//const int mod = 1e9 + 7;
using u64 = uint64_t;
using u128 = __uint128_t;
#define sc1(x) scanf("%lld", &(x));
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
void dbg_out() { cerr << endl; }
template <typename Head, typename... Tail>
void dbg_out(Head H, Tail... T)
{
    cerr << ' ' << H;
    dbg_out(T...);
}
#ifndef NEAL_DEBUG
#define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
#else
#define dbg(...)
#endif
/*Well, probably you won't understand anything,
because you didn't try to understand anything in your life,
you expect all hard work to be done for you by someone else. 
Let's start*/
const int X = 20000;

bitset<X> is_prime;
vector<int> pf;
vector<int> pr;

void init()
{
    pf.resize(X, 0);
    is_prime.flip();
    is_prime[0] = is_prime[1] = false;
    for (int i = 2; i < X; i++)
    {
        if (is_prime[i])
        {
            pr.push_back(i);
            pf[i] = i;
        }
        for (int p : pr)
        {
            if (ll(i) * p >= X)
                break;
            pf[i * p] = p;
            is_prime[i * p] = false;
            if (i % p == 0)
                break;
        }
    }
}

void solve()
{
    int n;
    cin >> n;
    int sz = pr.size();
    // dbg(sz);
    vector memo(sz + 5, vector(X + 1, (int)-1));
    auto dp = y_combinator(
        [&](auto self, int st, int n) -> int
        {
            if (n < 0)
                return -(int)1e5;
            if (st == sz)
            {
                if (n == 0)
                    return 0;
                else
                    return -(int)1e5;
            }
            int &res = memo[st][n];
            if (res != -1)
                return res;
            int a1 = 1 + self(st + 1, n - pr[st]);
            int a2 = self(st + 1, n);
            return res = max(a1, a2);
        }

    );
    int ans = dp(0, n);
    cout << (ans < 1 ? -1 : ans) << endl;
}
int main()
{

    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    init();
    solve();
    return 0;
}
0