結果
問題 | No.802 だいたい等差数列 |
ユーザー |
![]() |
提出日時 | 2019-03-18 08:58:24 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 69 ms / 2,000 ms |
コード長 | 2,996 bytes |
コンパイル時間 | 990 ms |
コンパイル使用メモリ | 102,764 KB |
実行使用メモリ | 23,552 KB |
最終ジャッジ日時 | 2024-07-17 21:20:35 |
合計ジャッジ時間 | 3,113 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 30 |
ソースコード
#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <iostream>#include <complex>#include <string>#include <algorithm>#include <numeric>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <unordered_map>#include <unordered_set>#include <functional>#include <cassert>typedef long long ll;using namespace std;#ifndef LOCAL#define debug(x) ;#else#define debug(x) cerr << __LINE__ << " : " << #x << " = " << (x) << endl;template <typename T1, typename T2>ostream &operator<<(ostream &out, const pair<T1, T2> &p) {out << "{" << p.first << ", " << p.second << "}";return out;}template <typename T>ostream &operator<<(ostream &out, const vector<T> &v) {out << '{';for (const T &item : v) out << item << ", ";out << "\b\b}";return out;}#endif#define mod 1000000007 //1e9+7(prime number)#define INF 1000000000 //1e9#define LLINF 2000000000000000000LL //2e18#define SIZE 200010vector<ll> factmemo, factmemoInv;ll factmemoMod = -1;ll factorial(int n, int M){if(factmemoMod == M) return factmemo[n];if(n <= 1) return 1;ll res = 1;for(int i=1; i<=n; i++) res = res * i % M;return res;}ll power(int k, int n, int M){if(n == 0) return 1;if(n == 1) return (ll)k;ll res = power(k, n/2, M);res = res * res % M;return n%2 == 1 ? res * k % M : res;}void initFactorial(int n, int M){factmemo.assign(n+1, 0);factmemoInv.assign(n+1, 0);factmemoMod = M;factmemo[0] = 1;for(int i=1;i<=n;i++) factmemo[i] = factmemo[i-1] * i % M;factmemoInv[n] = power(factmemo[n], M-2, M);for(int i=n;i>0;i--) factmemoInv[i-1] = factmemoInv[i] * i % M;}//nCm nPm nHm (mod M)/*Combination*/ll C(int n, int m, int M){if(n < m) return 0;if(m == 0 || n == m) return 1;if(factmemoMod == M)return factmemo[n] * factmemoInv[m] % M * factmemoInv[n-m] % M;ll numer = factorial(n, M);ll denom = factorial(m, M) * factorial(n-m, M) % M;denom = power((int)denom, M-2, M);return numer * denom % M;}/*Permutation*/ll P(int n, int m, int M){if(n < m) return 0;if(m == 0) return 1;if(factmemoMod == M)return factmemo[n] * factmemoInv[n-m] % M;ll numer = factorial(n, M);ll denom = factorial(n-m, M);denom = power((int)denom, M-2, M);return numer * denom % M;}/*Combination with Repetitions*/ll H(int n, int m, int M){if(n == 0 && m == 0) return 1;return C(n+m-1, m, M);}int main(){ll N, M, D1, D2;cin >> N >> M >> D1 >> D2;initFactorial(N + M, mod);if(M < D1 * (N - 1)) {cout << 0 << endl;return 0;}M --;M -= D1 * (N - 1);D2 -= D1;ll ans = 0;int sign = 1;debug(M); debug(D2);for(int i=0;i<N;i++){ll m = M - (D2 + 1) * i;if(m < 0) break;ll p = C(m + N, N, mod);ll q = C(N-1, i, mod);debug(p); debug(q);ans += (mod + sign * p * q % mod) % mod;sign *= -1;}cout << ans % mod << endl;return 0;}