結果

問題 No.5021 Addition Pyramid
ユーザー milkcoffee
提出日時 2025-02-26 12:03:53
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 1,880 ms / 2,000 ms
コード長 4,643 bytes
コンパイル時間 3,902 ms
コンパイル使用メモリ 257,548 KB
実行使用メモリ 6,820 KB
スコア 17,552,887
最終ジャッジ日時 2025-02-26 12:05:35
合計ジャッジ時間 100,533 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 50
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#if __has_include(<atcoder/all>)
#include <atcoder/all>
using namespace atcoder;
#endif
using namespace std;

// #include "boost/multiprecision/cpp_int.hpp"
// using namespace boost::multiprecision;

// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")

#define ll long long
#define rep(i, n) for (ll i = 0; i < n; ++i)
#define rep_up(i, a, n) for (ll i = a; i < n; ++i)
#define rep_down(i, a, n) for (ll i = a; i >= n; --i)
#define P pair<ll, ll>
#define pb push_back
#define bit_count(x) __builtin_popcountll(x)
// #define gcd(a, b) __gcd(a, b)
#define lcm(a, b) a / gcd(a, b) * b
// #define endl "\n"

#define all(v) v.begin(), v.end()
#define fi first
#define se second
#define vll vector<ll>
#define vvll vector<vll>
#define vvvll vector<vvll>
#define vvvvll vector<vvvll>
#define pqll priority_queue<ll>
#define pqllg priority_queue<ll, vector<ll>, greater<ll>>

template <class T>
inline void vin(vector<T> &v) { rep(i, v.size()) cin >> v.at(i); }
template <class T>
using V = vector<T>;

constexpr ll INF = (1ll << 60);
// constexpr ll mod = 1000000007;
constexpr ll mod = 998244353;

// using mint = atcoder::modint;
using mint = atcoder::modint998244353;
// using mint = atcoder::modint1000000007;
// using mint = atcoder::static_modint<1777777777>;
#define vmint vector<mint>
#define vvmint vector<vmint>
#define vvvmint vector<vvmint>
#define vvvvmint vector<vvvmint>

constexpr double pi = 3.14159265358979323846;

random_device seed_gen;
mt19937 engine(seed_gen());

template <typename T>
inline bool chmax(T &a, T b)
{
    if (a < b)
    {
        a = b;
        return 1;
    }
    return 0;
}
template <typename T>
inline bool chmin(T &a, T b)
{
    if (a > b)
    {
        a = b;
        return 1;
    }
    return 0;
}
template <typename T>
void pt(T val)
{
    cout << val << "\n";
}
template <typename T>
void pt_vll(vector<T> &v)
{
    ll vs = v.size();
    rep(i, vs)
    {
        cout << v[i];

        if (i == vs - 1)
            cout << "\n";
        else
            cout << " ";
    }
}
template <typename T>
void pt_vmint(vector<T> &v)
{
    ll vs = v.size();
    rep(i, vs)
    {
        cout << v[i].val();

        if (i == vs - 1)
            cout << "\n";
        else
            cout << " ";
    }
}
ll mypow(ll a, ll n)
{
    ll ret = 1;
    if (n == 0)
        return 1;
    if (a == 0)
        return 0;
    rep(i, n)
    {
        if (ret > (ll)(9e18 + 10) / a)
            return -1;
        ret *= a;
    }
    return ret;
}
long long modpow(long long a, long long n, long long mod)
{
    long long res = 1;
    while (n > 0)
    {
        if (n & 1)
            res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}

long long modinv(long long a, long long m)
{
    long long b = m, u = 1, v = 0;
    while (b)
    {
        long long t = a / b;
        a -= t * b;
        swap(a, b);
        u -= t * v;
        swap(u, v);
    }
    u %= m;
    if (u < 0)
        u += m;
    return u;
}

void solve();
// ここまでテンプレ

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    // cout << fixed << setprecision(16);
    // ll T;
    // cin >> T;
    // rep(ca, T)
    solve();
}

vvll A(50, vll(50));
ll N;
ll M;

ll diff(ll x, ll y)
{
    return min(abs(x - y), 100000000 - abs(x - y));
}

pair<ll, P> cal_score(vll &c)
{
    assert(c.size() == N);
    vvll x(N, vll(N));
    x[N - 1] = c;
    rep_down(i, N - 2, 0ll)
    {
        rep(j, i)
        {
            x[i][j] = x[i + 1][j] + x[i + 1][j + 1];
            x[i][j] %= M;
        }
    }
    ll res = -1;
    ll sx = -1, sy = -1;
    rep(i, N)
    {
        rep(j, i + 1)
        {
            if (chmax(res, diff(x[i][j], A[i][j])))
            {
                sx = i;
                sy = j;
            }
        }
    }
    return {res, {sx, sy}};
}

void solve()
{
    ll n, m, k, cnt = 0, sum = 0, ans = 0;
    M = 100000000;
    ll time = clock();
    cin >> N;
    rep(i, N)
    {
        rep(j, i + 1)
        {
            cin >> A[i][j];
        }
    }
    vll best = A[N - 1];
    pair<ll, P> rrr = cal_score(best);
    ll mi = rrr.first;
    auto [px, py] = rrr.second;
    while (clock() < 1.80 * CLOCKS_PER_SEC)
    {
        vll c = best;
        ll t = py;
        ll d = engine() % M;
        c[t] += d;
        c[t] %= M;
        auto sc = cal_score(c);
        if (chmin(mi, sc.first))
        {
            best = c;
            px = sc.second.first;
            py = sc.second.second;
        }
    }
    cerr << 5 * 10000000 - cal_score(best).first << endl;
    pt_vll(best);
}
0