結果
| 問題 |
No.741 AscNumber(Easy)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-01-19 11:52:37 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,856 bytes |
| コンパイル時間 | 3,792 ms |
| コンパイル使用メモリ | 258,108 KB |
| 最終ジャッジ日時 | 2025-02-18 20:27:26 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 35 MLE * 1 -- * 19 |
ソースコード
#include <bits/stdc++.h>
#include <bits/extc++.h>
using i64 = long long;
template <typename T, T MOD = 1000000007>
struct Mint
{
inline static constexpr T mod = MOD;
T v;
Mint() : v(0) {}
Mint(signed v) : v(v) {}
Mint(long long t)
{
v = t % MOD;
if (v < 0)
v += MOD;
}
Mint pow(long long k)
{
Mint res(1), tmp(v);
while (k)
{
if (k & 1)
res *= tmp;
tmp *= tmp;
k >>= 1;
}
return res;
}
static Mint add_identity() { return Mint(0); }
static Mint mul_identity() { return Mint(1); }
Mint inv() { return pow(MOD - 2); }
Mint &operator+=(Mint a)
{
v += a.v;
if (v >= MOD)
v -= MOD;
return *this;
}
Mint &operator-=(Mint a)
{
v += MOD - a.v;
if (v >= MOD)
v -= MOD;
return *this;
}
Mint &operator*=(Mint a)
{
v = 1LL * v * a.v % MOD;
return *this;
}
Mint &operator/=(Mint a) { return (*this) *= a.inv(); }
Mint operator+(Mint a) const { return Mint(v) += a; }
Mint operator-(Mint a) const { return Mint(v) -= a; }
Mint operator*(Mint a) const { return Mint(v) *= a; }
Mint operator/(Mint a) const { return Mint(v) /= a; }
Mint operator+() const { return *this; }
Mint operator-() const { return v ? Mint(MOD - v) : Mint(v); }
bool operator==(const Mint a) const { return v == a.v; }
bool operator!=(const Mint a) const { return v != a.v; }
static Mint comb(long long n, int k)
{
Mint num(1), dom(1);
for (int i = 0; i < k; i++)
{
num *= Mint(n - i);
dom *= Mint(i + 1);
}
return num / dom;
}
};
template <typename T, T MOD>
std::ostream &operator<<(std::ostream &os, Mint<T, MOD> m)
{
os << m.v;
return os;
}
using Z = Mint<i64>;
void solve()
{
int n;
std::cin >> n;
std::string s = "1" + std::string(n, '0');
n = n + 1;
const i64 NIL = -1;
std::vector dp(n, std::vector(10, std::vector(2, std::vector(2, NIL))));
auto dfs = [&](auto self, int i, int cur, bool is_limit, bool is_asc) -> Z
{
if (i == n)
{
return is_asc;
}
auto &ndp = dp[i][cur][is_limit][is_asc];
if (ndp != NIL)
{
return ndp;
}
Z ans = 0;
int up = is_limit ? s[i] - '0' : 9;
for (int d = 0; d <= up; d++)
{
if (d >= cur)
{
ans += self(self, i + 1, d, is_limit and d == up, true);
}
}
return ndp = ans.v;
};
std::cout << dfs(dfs, 0, 0, true, true) << '\n';
}
int main()
{
std::cin.tie(nullptr)->sync_with_stdio(false);
solve();
return 0;
}