結果
問題 | No.802 だいたい等差数列 |
ユーザー |
![]() |
提出日時 | 2019-05-15 21:49:38 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 278 ms / 2,000 ms |
コード長 | 1,187 bytes |
コンパイル時間 | 780 ms |
コンパイル使用メモリ | 67,040 KB |
実行使用メモリ | 23,844 KB |
最終ジャッジ日時 | 2024-09-14 13:55:44 |
合計ジャッジ時間 | 8,585 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 30 |
ソースコード
#include <iostream>using namespace std;const long long mod = 1000000007;const int MAX_N = 1300000;long long fact[1300009], inv[1300009];long long modpow(long long a, long long b, long long m) {long long p = 1, q = a;for (int i = 0; i < 30; i++) {if ((b / (1LL << i)) % 2 == 1) { p *= q; p %= m; }q *= q; q %= m;}return p;}long long Div(long long a, long long b, long long m) {return (a * modpow(b, m - 2, m));}void init() {fact[0] = 1;for (int i = 1; i <= MAX_N; i++) fact[i] = 1LL * fact[i - 1] * i % mod;for (int i = 0; i <= MAX_N; i++) inv[i] = Div(1, fact[i], mod);}long long ncr(long long n, long long r) {if (r < 0 || n < r) return 0;return (fact[n] * inv[r] % mod) * inv[n - r] % mod;}long long choose(long long n, long long r) {return ncr(n + r - 1, r);}long long N, M, D, D1, D2, sum;int main() {cin >> N >> M >> D1 >> D2; init();M -= (N - 1LL) * D1; D = D2 - D1;for (int i = 0; i <= M; i++) {long long A = M - 1LL * (D + 1LL) * i;long long B = N;long long T = choose(A, B) * ncr(B - 1, i) % mod;if (i % 2 == 0) sum += T;if (i % 2 == 1) sum -= T;}cout << (sum + mod * mod) % mod << endl;return 0;}