結果
| 問題 |
No.1463 Hungry Kanten
|
| コンテスト | |
| ユーザー |
KoD
|
| 提出日時 | 2021-04-02 21:40:16 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,618 ms / 2,000 ms |
| コード長 | 2,908 bytes |
| コンパイル時間 | 6,016 ms |
| コンパイル使用メモリ | 230,732 KB |
| 実行使用メモリ | 251,904 KB |
| 最終ジャッジ日時 | 2025-06-20 01:32:10 |
| 合計ジャッジ時間 | 10,044 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 24 |
ソースコード
#include <bits/stdc++.h>
using i32 = std::int32_t;
using u32 = std::uint32_t;
using i64 = std::int64_t;
using u64 = std::uint64_t;
using i128 = __int128_t;
using u128 = __uint128_t;
using isize = std::ptrdiff_t;
using usize = std::size_t;
class rep {
struct Iter {
usize itr;
constexpr Iter(const usize pos) noexcept : itr(pos) {}
constexpr void operator++() noexcept { ++itr; }
constexpr bool operator!=(const Iter& other) const noexcept {
return itr != other.itr;
}
constexpr usize operator*() const noexcept { return itr; }
};
const Iter first, last;
public:
explicit constexpr rep(const usize first, const usize last) noexcept
: first(first), last(std::max(first, last)) {}
constexpr Iter begin() const noexcept { return first; }
constexpr Iter end() const noexcept { return last; }
};
template <class T> std::vector<std::pair<T, usize>> factorize(T x) {
assert(x > 0);
std::vector<std::pair<T, usize>> ret;
for (T i = 2; i * i <= x; ++i) {
if (x % i == 0) {
ret.emplace_back(i, 0);
while (x % i == 0) {
ret.back().second++;
x /= i;
}
}
}
if (x > 1) {
ret.emplace_back(x, 1);
}
return ret;
}
constexpr u64 popcount(const u64 x) { return __builtin_popcountll(x); }
template <class T> using Vec = std::vector<T>;
void C_main() {
usize N, K;
std::cin >> N >> K;
Vec<u32> A(N);
for (auto& x : A) {
std::cin >> x;
}
Vec<Vec<std::pair<u32, usize>>> fct(N);
for (auto i : rep(0, N)) {
fct[i] = factorize(A[i]);
}
std::array<bool, 18 * 1000 + 1> make{};
std::set<std::map<u32, usize>> res;
for (auto set : rep(0, 1 << N)) {
if (popcount(set) < K) {
continue;
}
{
u32 sum = 0;
for (auto i : rep(0, N)) {
if (set >> i & 1) {
sum += A[i];
}
}
make[sum] = true;
}
{
u32 cur = 1;
std::map<u32, usize> prod;
for (auto i : rep(0, N)) {
if (set >> i & 1) {
if (cur <= 18 * 1000) {
cur *= A[i];
}
for (const auto [p, e] : fct[i]) {
prod[p] += e;
}
}
}
if (cur <= 18 * 1000) {
make[cur] = true;
} else {
res.insert(prod);
}
}
}
usize ans = res.size();
for (const auto x : make) {
if (x) {
ans += 1;
}
}
std::cout << ans << '\n';
return;
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
C_main();
return 0;
}
KoD