結果
| 問題 |
No.1185 完全な3の倍数
|
| コンテスト | |
| ユーザー |
KoD
|
| 提出日時 | 2020-08-22 13:14:14 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 72 ms / 2,000 ms |
| コード長 | 5,503 bytes |
| コンパイル時間 | 893 ms |
| コンパイル使用メモリ | 77,628 KB |
| 最終ジャッジ日時 | 2025-01-13 07:19:53 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 39 |
ソースコード
#line 1 "main.cpp"
/**
* @title Template
*/
#include <iostream>
#include <algorithm>
#include <utility>
#include <numeric>
#include <vector>
#include <array>
#include <cassert>
#line 2 "/Users/kodamankod/Desktop/Programming/Library/other/chmin_chmax.cpp"
template <class T, class U>
constexpr bool chmin(T &lhs, const U &rhs) {
if (lhs > rhs) { lhs = rhs; return true; }
return false;
}
template <class T, class U>
constexpr bool chmax(T &lhs, const U &rhs) {
if (lhs < rhs) { lhs = rhs; return true; }
return false;
}
/**
* @title Chmin/Chmax
*/
#line 2 "/Users/kodamankod/Desktop/Programming/Library/other/range.cpp"
#line 4 "/Users/kodamankod/Desktop/Programming/Library/other/range.cpp"
class range {
public:
class iterator {
private:
int64_t M_position;
public:
constexpr iterator(int64_t position) noexcept: M_position(position) { }
constexpr void operator ++ () noexcept { ++M_position; }
constexpr bool operator != (iterator other) const noexcept { return M_position != other.M_position; }
constexpr int64_t operator * () const noexcept { return M_position; }
};
class reverse_iterator {
private:
int64_t M_position;
public:
constexpr reverse_iterator(int64_t position) noexcept: M_position(position) { }
constexpr void operator ++ () noexcept { --M_position; }
constexpr bool operator != (reverse_iterator other) const noexcept { return M_position != other.M_position; }
constexpr int64_t operator * () const noexcept { return M_position; }
};
private:
const iterator M_first, M_last;
public:
constexpr range(int64_t first, int64_t last) noexcept: M_first(first), M_last(std::max(first, last)) { }
constexpr iterator begin() const noexcept { return M_first; }
constexpr iterator end() const noexcept { return M_last; }
constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator(*M_last - 1); }
constexpr reverse_iterator rend() const noexcept { return reverse_iterator(*M_first - 1); }
};
/**
* @title Range
*/
#line 2 "/Users/kodamankod/Desktop/Programming/Library/other/rev.cpp"
#include <type_traits>
#include <iterator>
#line 6 "/Users/kodamankod/Desktop/Programming/Library/other/rev.cpp"
template <class T>
class rev_impl {
public:
using iterator = decltype(std::rbegin(std::declval<T>()));
private:
const iterator M_begin;
const iterator M_end;
public:
constexpr rev_impl(T &&cont) noexcept: M_begin(std::rbegin(cont)), M_end(std::rend(cont)) { }
constexpr iterator begin() const noexcept { return M_begin; }
constexpr iterator end() const noexcept { return M_end; }
};
template <class T>
constexpr decltype(auto) rev(T &&cont) {
return rev_impl<T>(std::forward<T>(cont));
}
/**
* @title Reverser
*/
#line 2 "/Users/kodamankod/Desktop/Programming/Library/other/int_operation.cpp"
#include <cstdint>
#include <type_traits>
#include <limits>
template <class T>
constexpr typename std::make_unsigned<T>::type negation_impl(const T x) {
using unsigned_type = typename std::make_unsigned<T>::type;
if (x == std::numeric_limits<T>::min()) return static_cast<unsigned_type>(x);
return static_cast<unsigned_type>(-x);
}
template <class T>
constexpr typename std::enable_if<std::is_unsigned<T>::value && std::is_integral<T>::value, bool>::type
mul_overflow(const T x, const T y, const T z) { return (x == 0 || y == 0) ? false : x > z / y; }
template <class T>
constexpr typename std::enable_if<std::is_signed<T>::value && std::is_integral<T>::value, bool>::type
mul_overflow(const T x, const T y, const T z) {
if (x == 0 || y == 0) return z < 0;
using unsigned_type = typename std::make_unsigned<T>::type;
if (x > 0 && y > 0) return z <= 0 ? true : mul_overflow<unsigned_type>(x, y, z);
if (x > 0) return z >= 0 ? false : mul_overflow<unsigned_type>(x, negation_impl(y), negation_impl(z));
if (y > 0) return z >= 0 ? false : mul_overflow<unsigned_type>(negation_impl(x), y, negation_impl(z));
return mul_overflow<unsigned_type>(negation_impl(x), negation_impl(y), z);
}
template <class T>
constexpr typename std::enable_if<std::is_integral<T>::value, T>::type
isqrt(T x) {
T ok = 0, ng = std::numeric_limits<T>::max();
while (ng - ok > 1) {
const T md = ok + ((ng - ok) >> 1);
(mul_overflow(md, md, x) ? ng : ok) = md;
}
return ok;
}
template <class T>
constexpr typename std::enable_if<std::is_integral<T>::value, T>::type
ipower(T x, uint64_t e) {
T res = 1;
while (e > 0) {
if (e & 1) res *= x;
e >>= 1;
if (e > 0) x *= x;
}
return res;
}
/**
* @title Integer Operations
*/
#line 18 "main.cpp"
using i32 = int32_t;
using i64 = int64_t;
using u32 = uint32_t;
using u64 = uint64_t;
constexpr i32 inf32 = (i32(1) << 30) - 1;
constexpr i64 inf64 = (i64(1) << 62) - 1;
int main() {
std::array<bool, 100> ok{};
for (auto i: range(0, 100)) {
ok[i] = true;
if (i % 3 != 0) {
ok[i] = false;
continue;
}
if (i < 10) {
ok[i] = false;
continue;
}
if (((i / 10) + (i % 10)) % 3 != 0) {
ok[i] = false;
continue;
}
}
i32 N;
std::cin >> N;
i32 cnt = 0;
for (auto i: range(0, std::min(N + 1, 100))) {
if (ok[i]) {
++cnt;
}
}
for (auto S: range(0, ipower(4, 9))) {
i32 num = 0;
for (auto i: range(0, 9)) {
num *= 10;
num += std::vector<i32>{ 0, 3, 6, 9 }[S % 4];
S /= 4;
}
if (num >= 100 && num <= N) {
++cnt;
}
}
std::cout << cnt << '\n';
return 0;
}
KoD