結果
| 問題 |
No.906 Y字グラフ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-10-11 22:05:22 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,044 bytes |
| コンパイル時間 | 1,485 ms |
| コンパイル使用メモリ | 167,208 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-25 07:32:06 |
| 合計ジャッジ時間 | 2,437 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 21 WA * 7 |
ソースコード
#include <bits/stdc++.h>
using namespace std::literals::string_literals;
using i64 = std::int_fast64_t;
using std::cout;
using std::endl;
using std::cin;
template<typename T>
std::vector<T> make_v(size_t a){return std::vector<T>(a);}
template<typename T,typename... Ts>
auto make_v(size_t a,Ts... ts){
return std::vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...));
}
template <std::uint_fast64_t Modulus>
class modint {
using u32 = std::uint_fast32_t;
using u64 = std::uint_fast64_t;
using i64 = std::int_fast64_t;
public:
u64 a;
constexpr modint() noexcept : a(0) {}
constexpr modint(const u64 & x) noexcept : a(x % Modulus) {}
constexpr u64 &value() noexcept { return a; }
constexpr const u64 &value() const noexcept { return a; }
const modint inverse() const {
i64 x = a, b = Modulus, u = 1, v = 0;
while(b > 0) {
auto t = x / b;
std::swap(x -= t * b, b);
std::swap(u -= t * v, v);
}
return modint(u);
}
const modint pow(i64 k) const {
return modint(*this) ^ k;
}
static u64 mod() { return Modulus; }
constexpr modint & operator+=(const modint & rhs) noexcept {
a += rhs.a;
if (a >= Modulus) a -= Modulus;
return *this;
}
constexpr modint & operator-=(const modint & rhs) noexcept {
if (a < rhs.a) a += Modulus;
a -= rhs.a;
return *this;
}
constexpr modint & operator*=(const modint & rhs) noexcept {
a = a * rhs.a % Modulus;
return *this;
}
constexpr modint & operator/=(modint rhs) noexcept {
u64 exp = Modulus - 2;
while (exp) {
if (exp % 2) (*this) *= rhs;
rhs *= rhs;
exp /= 2;
}
return *this;
}
constexpr modint & operator^=(u64 k) noexcept {
auto b = modint(1);
while(k) {
if(k & 1) b = b * (*this);
(*this) *= (*this);
k >>= 1;
}
return (*this) = b;
}
constexpr modint & operator=(const modint & rhs) noexcept {
a = rhs.a;
return (*this);
}
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 u64 & k) const noexcept { return modint(*this) ^= k; }
constexpr modint operator-() const noexcept { return modint(Modulus - a); }
constexpr modint operator++() noexcept { return (*this) = modint(*this) + 1; }
constexpr modint operator--() noexcept { return (*this) = modint(*this) - 1; }
const bool operator==(const modint & rhs) const noexcept { return a == rhs.a; };
const bool operator!=(const modint & rhs) const noexcept { return a != rhs.a; };
const bool operator<=(const modint & rhs) const noexcept { return a <= rhs.a; };
const bool operator>=(const modint & rhs) const noexcept { return a >= rhs.a; };
const bool operator<(const modint & rhs) const noexcept { return a < rhs.a; };
const bool operator>(const modint & rhs) const noexcept { return a > rhs.a; };
explicit operator bool() const { return a; }
explicit operator u32() const { return a; }
friend std::ostream & operator<<(std::ostream & os, const modint & p) {
return os << p.a;
}
friend std::istream & operator>>(std::istream & is, modint & p) {
u64 t;
is >> t;
p = modint(t);
return is;
}
};
using mint = modint<(int)(1e9 + 7)>;
int main() {
i64 n; scanf("%lld", &n);
if(n <= 5) {
printf("1\n");
return 0;
} else if(n == 6) {
printf("2\n");
return 0;
}
n -= 4;
auto calc_even = [&](i64 n) {
i64 I = n / 6;
mint A = (mint)(I + 1) * n / 2;
mint B = (mint)I * (I + 1) * 3 / 2;
return A - B;
};
auto calc_odd = [&](i64 n) {
i64 I = (n - 1) / 6;
mint A = (mint)(I + 1) * (n - 1) / 2;
mint B = (mint)I * (I + 1) * 3 / 2;
return A - B;
};
mint ans = (n + 1) / 3LL + 1;
if(n & 1) {
ans += calc_odd(n) + calc_even(n - 3);
} else {
ans += calc_even(n) + calc_odd(n - 3);
}
printf("%lld\n", ans.value());
return 0;
}