結果
| 問題 |
No.1011 Infinite Stairs
|
| コンテスト | |
| ユーザー |
micheeeeell1001
|
| 提出日時 | 2020-03-20 21:59:01 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 80 ms / 2,000 ms |
| コード長 | 4,251 bytes |
| コンパイル時間 | 7,542 ms |
| コンパイル使用メモリ | 255,996 KB |
| 最終ジャッジ日時 | 2025-01-09 08:33:32 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 24 |
ソースコード
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
#define rep(i,x) for(ll i = 0; i < (ll)(x); i++)
#define rrep(i,x) for(ll i = (ll)(x)-1;0 <= i; i--)
#define reps(i,x) for(ll i = 1; i < (ll)(x)+1; i++)
#define rreps(i,x) for(ll i = (ll)(x); 1 <= i; i--)
#define debug(x) cerr << #x << ": " << (x) << "\n";
#define all(x) (x).begin(), (x).end()
typedef long long ll;
typedef long double ld;
typedef pair<int,int> P;
typedef pair<ll,ll> Pll;
typedef vector<ll> vl;
typedef vector<vector<ll>> vvl;
typedef vector<vector<vector<ll>>> vvvl;
const ll INF = numeric_limits<ll>::max()/4;
const int n_max = 1e5+10;
template<std::int_fast64_t Modulus>
class modint {
using i64 = int_fast64_t;
public:
i64 a;
constexpr modint(const i64 x = 0) noexcept {
this -> a = x % Modulus;
if(a < 0){
a += Modulus;
}
}
// constexpr i64 &value() const noexcept {return a;}
constexpr const i64 &value() const noexcept {return a;}
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 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 {
i64 a_ = rhs.a, b = Modulus, u = 1, v = 0;
while(b){
i64 t = a_/b;
a_ -= t * b; swap(a_,b);
u -= t * v; swap(u,v);
}
a = a * u % Modulus;
if(a < 0) a += Modulus;
return *this;
}
// 自前実装
constexpr bool operator==(const modint rhs) noexcept {
return a == rhs.a;
}
constexpr bool operator!=(const modint rhs) noexcept {
return a != rhs.a;
}
constexpr bool operator>(const modint rhs) noexcept {
return a > rhs.a;
}
constexpr bool operator>=(const modint rhs) noexcept {
return a >= rhs.a;
}
constexpr bool operator<(const modint rhs) noexcept {
return a < rhs.a;
}
constexpr bool operator<=(const modint rhs) noexcept {
return a <= rhs.a;
}
constexpr modint& operator++() noexcept {
return (*this) += modint(1);
}
constexpr modint operator++(int) {
modint tmp(*this);
operator++();
return tmp;
}
constexpr modint& operator--() noexcept {
return (*this) -= modint(1);
}
constexpr modint operator--(int) {
modint tmp(*this);
operator--();
return tmp;
}
template<typename T>
friend constexpr modint modpow(modint &mt, T n) noexcept {
if(n < 0){
modint t = (modint(1) / mt);
return modpow(t, -n);
}
modint res = 1;
while(n){
if(n & 1)res *= mt;
mt *= mt;
n /= 2;
}
return res;
}
};
const ll MOD = 1e9+7;
using mint = modint<MOD>;
// 標準入出力対応
std::ostream &operator<<(std::ostream &out, const modint<MOD> &m) {
out << m.a;
return out;
}
std::istream &operator>>(std::istream &in, modint<MOD> &m) {
ll a;
in >> a;
m = mint(a);
return in;
}
int main(){
ll n,d,k; cin >> n >> d >> k;
mint a = 0;
mint dp[2][k] = {};
dp[0][0] = 1;
rep(i,n){
vector<mint> sum(k+1, 0);
rep(j,k)sum[j+1] = sum[j] + dp[i & 1][j];
rep(j,k+1){
dp[(i+1) & 1][j] = sum[j] - sum[max(0LL,j-d)];
}
}
cout << dp[n & 1][k] << endl;
}
micheeeeell1001