提出 #15050255


ソースコード 拡げる

#include<bits/stdc++.h>
#define rep(i, x) for (ll i = 0; i < (x); i++)
#define chmax(x, a)  do { x = max(x, a); } while(0)

template<typename T>
using reversed_priority_queue = \
    std::priority_queue<T, std::vector<T>, std::greater<T> >;
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
// {{{ Modint
// using mint = modint<1000000007>;
// mint x = 2;
// mint y = mint::P(5, 2);
// std::cout << x.a << std::endl;
template <std::int64_t M>
class modint {
 public:
  int64_t a;
  static std::vector<modint> fact;
  static std::vector<modint> inv_fact;
  explicit constexpr modint(const int64_t x = 0) noexcept :
    a((x % M + M) % M) {}
  constexpr int64_t &value() noexcept { return a; }
  constexpr const int64_t &value() const noexcept { return a; }
  constexpr modint operator+(const modint rhs) const noexcept {
    return modint(*this) += rhs;
  }
  constexpr modint operator-(const modint rhs) const noexcept {
    return modint(*this) -= rhs;
  }
  constexpr modint operator*(const modint rhs) const noexcept {
    return modint(*this) *= rhs;
  }
  constexpr modint operator/(const modint rhs) const noexcept {
    return modint(*this) /= rhs;
  }
  constexpr modint &operator+=(const modint rhs) noexcept {
    a += rhs.a;
    if (a >= M) {
      a -= M;
    }
    return *this;
  }
  constexpr modint &operator-=(const modint rhs) noexcept {
    if (a < rhs.a) {
      a += M;
    }
    a -= rhs.a;
    return *this;
  }
  constexpr modint &operator*=(const modint rhs) noexcept {
    a = a * rhs.a % M;
    return *this;
  }
  constexpr modint &operator/=(modint rhs) noexcept {
    int64_t exp = M - 2;
    while (exp) {
      if (exp % 2) {
        *this *= rhs;
      }
      rhs *= rhs;
      exp /= 2;
    }
    return *this;
  }
  constexpr modint pow(ll t) const {
    if (!t) return modint(1);
    modint a = pow(t>>1);
    a *= a;
    if (t&1) a *= *this;
    return a;
  }
  static modint P(ll n, ll k) {
    if (fact.size() == 0) {
      const ll T = 3000000;
      fact.resize(T, modint(1));
      inv_fact.resize(T, modint(1));
      for (ll i = 2; i < T; i++) fact[i] = fact[i-1] * modint(i);
      for (ll i = 2; i < T; i++) inv_fact[i] = inv_fact[i-1] / modint(i);
    }
    if (n < k) return modint(0);
    if (n < 0 || k < 0) return modint(0);
    return fact[n] * inv_fact[n - k];
  }

  static modint C(ll n, ll k) {
    if (n < k) return modint(0);
    if (n < 0 || k < 0) return modint(0);
    return P(n, k) * inv_fact[k];
  }
};
template <std::int64_t M>
std::vector<modint<M>> modint<M>::fact;
template <std::int64_t M>
std::vector<modint<M>> modint<M>::inv_fact;
// }}}
using mint = modint<1000000007>;

int main(void) {
  ll N, K;
  cin >> N >> K;

  deque<ll> a;  // 非負数を降順 9 6 5 ...
  deque<ll> b;  // 負数を昇順 -8 -7 -3 ...
  deque<ll> c;  // すべての要素
  {
    vector<ll> av;
    vector<ll> bv;
    vector<ll> cv;
    rep(i, N) {
      ll x;
      cin >> x;
      if (x >= 0) av.push_back(x);
      else bv.push_back(x);
      cv.push_back(x);
    }
    sort(begin(av), end(av), greater<ll>());
    sort(begin(bv), end(bv));
    sort(begin(cv), end(cv), [](const ll l, const ll r) {
        if (abs(l) == abs(r))
          return l > r;
        else
          return abs(l) < abs(r);
        });
    
    rep(i, av.size()) a.push_back(av[i]);
    rep(i, bv.size()) b.push_back(bv[i]);
    rep(i, cv.size()) c.push_back(cv[i]);
  }

  // 答えが負数になる場合
  mint ans_min(1);
  rep(i, K)
    ans_min *= mint(c[i]);

  // 答えが正数になる場合
  mint ans(1);
  while(K >= 2 && a.size() >= 2 && b.size() >= 2) {
    ll av = a[0] * a[1];
    ll bv = b[0] * b[1];
    if (av > bv) {
      ans *= mint(a[0]);  // 1個だけ取るのが肝!
      a.erase(a.begin());
      K--;
    } else {
      ans *= mint(b[0]) * mint(b[1]);
      b.erase(b.begin());
      b.erase(b.begin());
      K-=2;
    }
  }

  if (K >= 2) {
    if (a.size() <= 1) {
      while (K >= 2 && b.size() >= 2) {
        ans *= mint(b[0]) * mint(b[1]);
        b.erase(b.begin());
        b.erase(b.begin());
        K-=2;
      }
    } else { // b.size() <= 1
      while (K > 0 && a.size() > 0) {
        ans *= mint(a[0]);
        a.erase(a.begin());
        K--;
      }
    }
  }


  if (K == 0) {
    cout << ans.value() << endl;
    return 0;
  }

  if (K == 1) {
    if (a.size() > 0) {
      ans *= mint(a[0]);
    } else { // b.size() > 0
      ans = ans_min;
    }
    cout << ans.value() << endl;
    K--;
    return 0;
  }
  return 0;
}

提出情報

提出日時
問題 E - Multiplication 4
ユーザ bobuhiro11
言語 C++ (GCC 9.2.1)
得点 500
コード長 4731 Byte
結果 AC
実行時間 109 ms
メモリ 9728 KiB

コンパイルエラー

./Main.cpp: In function ‘int main()’:
./Main.cpp:2:36: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
    2 | #define rep(i, x) for (ll i = 0; i < (x); i++)
      |                                    ^
./Main.cpp:127:5: note: in expansion of macro ‘rep’
  127 |     rep(i, av.size()) a.push_back(av[i]);
      |     ^~~
./Main.cpp:2:36: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
    2 | #define rep(i, x) for (ll i = 0; i < (x); i++)
      |                                    ^
./Main.cpp:128:5: note: in expansion of macro ‘rep’
  128 |     rep(i, bv.size()) b.push_back(bv[i]);
      |     ^~~
./Main.cpp:2:36: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
    2 | #define rep(i, x) for (ll i = 0; i < (x); i++)
      |                                    ^
./Main.cpp:129:5: note: in expansion of macro ‘rep’
  129 |     rep(i, cv.size()) c.push_back(cv[i]);
      |     ^~~

ジャッジ結果

セット名 Sample All after_contest
得点 / 配点 0 / 0 500 / 500 0 / 0
結果
AC × 4
AC × 39
AC × 1
セット名 テストケース
Sample sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt
All hand_01.txt, hand_02.txt, hand_03.txt, hand_04.txt, hand_05.txt, random_m01.txt, random_m02.txt, random_m03.txt, random_m04.txt, random_m05.txt, random_m06.txt, random_max01.txt, random_max02.txt, random_mz01.txt, random_mz02.txt, random_mz03.txt, random_p01.txt, random_p02.txt, random_pm00.txt, random_pm01.txt, random_pm02.txt, random_pm03.txt, random_pm11.txt, random_pm12.txt, random_pmz01.txt, random_pmz02.txt, random_pmz03.txt, random_pmz04.txt, random_pmz11.txt, random_pmz12.txt, random_pmz13.txt, random_pz01.txt, random_pz02.txt, random_pz03.txt, random_z01.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt
after_contest after_contest_01.txt
ケース名 結果 実行時間 メモリ
after_contest_01.txt AC 86 ms 9728 KiB
hand_01.txt AC 82 ms 9652 KiB
hand_02.txt AC 95 ms 9648 KiB
hand_03.txt AC 91 ms 9720 KiB
hand_04.txt AC 88 ms 9504 KiB
hand_05.txt AC 89 ms 9460 KiB
random_m01.txt AC 45 ms 5272 KiB
random_m02.txt AC 19 ms 3844 KiB
random_m03.txt AC 52 ms 5756 KiB
random_m04.txt AC 98 ms 8780 KiB
random_m05.txt AC 84 ms 7804 KiB
random_m06.txt AC 22 ms 3900 KiB
random_max01.txt AC 109 ms 9636 KiB
random_max02.txt AC 104 ms 9620 KiB
random_mz01.txt AC 66 ms 6516 KiB
random_mz02.txt AC 14 ms 3928 KiB
random_mz03.txt AC 9 ms 3900 KiB
random_p01.txt AC 57 ms 6512 KiB
random_p02.txt AC 50 ms 6020 KiB
random_pm00.txt AC 32 ms 4344 KiB
random_pm01.txt AC 41 ms 4916 KiB
random_pm02.txt AC 74 ms 7004 KiB
random_pm03.txt AC 45 ms 5324 KiB
random_pm11.txt AC 60 ms 6504 KiB
random_pm12.txt AC 19 ms 3676 KiB
random_pmz01.txt AC 63 ms 6764 KiB
random_pmz02.txt AC 91 ms 8784 KiB
random_pmz03.txt AC 43 ms 5120 KiB
random_pmz04.txt AC 48 ms 5484 KiB
random_pmz11.txt AC 58 ms 6544 KiB
random_pmz12.txt AC 17 ms 3824 KiB
random_pmz13.txt AC 56 ms 6620 KiB
random_pz01.txt AC 40 ms 5272 KiB
random_pz02.txt AC 75 ms 8064 KiB
random_pz03.txt AC 31 ms 7616 KiB
random_z01.txt AC 47 ms 9044 KiB
sample_01.txt AC 2 ms 3424 KiB
sample_02.txt AC 3 ms 3556 KiB
sample_03.txt AC 2 ms 3476 KiB
sample_04.txt AC 2 ms 3424 KiB