結果
問題 | No.1035 Color Box |
ユーザー |
![]() |
提出日時 | 2020-04-25 00:26:18 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 23 ms / 2,000 ms |
コード長 | 3,447 bytes |
コンパイル時間 | 1,536 ms |
コンパイル使用メモリ | 168,508 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-10-15 04:02:44 |
合計ジャッジ時間 | 2,783 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 36 |
ソースコード
#line 1 "/mnt/c/Users/leafc/dev/compro/lib/math/modint.hpp"#include <cstdint>#include <iostream>#ifndef MOD_INT#define MOD_INTtemplate <std::uint_fast64_t MOD> class ModInt {using u64 = std::uint_fast64_t;public:ModInt(const u64 val = 0) { value = val % MOD; }ModInt operator+(const ModInt rhs) const { return ModInt(*this) += rhs; }ModInt operator-(const ModInt rhs) const { return ModInt(*this) -= rhs; }ModInt operator*(const ModInt rhs) const { return ModInt(*this) *= rhs; }ModInt operator/(const ModInt rhs) const { return ModInt(*this) /= rhs; }ModInt &operator+=(const ModInt rhs) {value += rhs.value;if (value >= MOD) {value -= MOD;}return *this;}ModInt &operator-=(const ModInt rhs) {if (value < rhs.value) {value += MOD;}value -= rhs.value;return *this;}ModInt &operator*=(const ModInt rhs) {value = value * rhs.value % MOD;return *this;}ModInt &operator/=(ModInt rhs) {*this *= rhs.inv();return *this;}ModInt &operator++(int n) {value++;if (value >= MOD) {value -= MOD;}return *this;}ModInt &operator--(int n) {if (value == 0) {value += MOD;}value--;return *this;}ModInt inv() { return ModInt::pow(*this, MOD - 2); }static ModInt pow(ModInt base, long long int n) {ModInt res = ModInt(1);while (n) {if (n & 1) {res *= base;}base *= base;n /= 2;}return res;}static ModInt comb(ModInt n, ModInt r) { return comb(n.value, r.value); }static ModInt comb(int n, int r) {if (n < r)return ModInt(0);ModInt res = ModInt(1);for (int i = 0; i < r; i++) {res *= ModInt(n - i);}ModInt inv = ModInt(1);for (int i = 0; i < r; i++) {inv *= ModInt(r - i);}return res / inv;}u64 getValue() const { return value; }private:u64 value;friend std::ostream &operator<<(std::ostream &out, const ModInt<MOD> &m) {out << m.value;return out;}friend std::istream &operator>>(std::istream &in, ModInt &m) {uint_fast64_t i;in >> i;m = ModInt(i);return in;}};#endif#line 1 "/mnt/c/Users/leafc/dev/compro/lib/template.hpp"#include <bits/stdc++.h>#define REP(i, n) for (int i = 0; i < n; i++)#define FOR(i, m, n) for (int i = m; i < n; i++)#define ALL(v) (v).begin(), (v).end()#define coutd(n) cout << fixed << setprecision(n)#define ll long long int#define vl vector<ll>#define vi vector<int>#define MM << " " <<using namespace std;template <class T> void say(bool val, T yes = "Yes", T no = "No") { cout << (val ? yes : no) << endl; }template <class T> void chmin(T &a, T b) {if (a > b)a = b;}template <class T> void chmax(T &a, T b) {if (a < b)a = b;}#line 3 "tmp.cpp"template <class T> std::vector<T> combination_table(int n) {std::vector<T> vec(n + 1);vec[0] = T(1);for (int r = 1; r < n + 1; r++) {vec[r] = vec[r - 1] * T(n - r + 1) / T(r);}return vec;}using mint = ModInt<(int)1e9 + 7>;int main() {cin.tie(0);ios::sync_with_stdio(false);int n, m;cin >> n >> m;auto ct = combination_table<mint>(m);vector<mint> dp(m + 1);dp[1] = mint(m);FOR(i, 2, m + 1) {mint tmp = ct[i] * mint::pow(mint(i), n) - dp[i - 1];dp[i] = tmp;}cout << dp[m] << endl;return 0;}