結果
問題 | No.895 MESE |
ユーザー | algon_320 |
提出日時 | 2019-09-27 23:12:32 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 404 ms / 2,000 ms |
コード長 | 5,058 bytes |
コンパイル時間 | 1,835 ms |
コンパイル使用メモリ | 172,372 KB |
実行使用メモリ | 36,976 KB |
最終ジャッジ日時 | 2024-09-25 01:38:42 |
合計ジャッジ時間 | 14,055 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 358 ms
34,516 KB |
testcase_01 | AC | 358 ms
34,484 KB |
testcase_02 | AC | 358 ms
34,552 KB |
testcase_03 | AC | 356 ms
34,528 KB |
testcase_04 | AC | 359 ms
34,528 KB |
testcase_05 | AC | 357 ms
34,604 KB |
testcase_06 | AC | 357 ms
34,408 KB |
testcase_07 | AC | 358 ms
34,496 KB |
testcase_08 | AC | 358 ms
34,520 KB |
testcase_09 | AC | 357 ms
34,524 KB |
testcase_10 | AC | 358 ms
34,504 KB |
testcase_11 | AC | 359 ms
34,484 KB |
testcase_12 | AC | 358 ms
34,448 KB |
testcase_13 | AC | 384 ms
35,720 KB |
testcase_14 | AC | 381 ms
35,988 KB |
testcase_15 | AC | 394 ms
35,916 KB |
testcase_16 | AC | 385 ms
35,704 KB |
testcase_17 | AC | 375 ms
35,828 KB |
testcase_18 | AC | 403 ms
36,884 KB |
testcase_19 | AC | 403 ms
36,976 KB |
testcase_20 | AC | 402 ms
36,800 KB |
testcase_21 | AC | 401 ms
36,820 KB |
testcase_22 | AC | 404 ms
36,948 KB |
testcase_23 | AC | 403 ms
36,848 KB |
testcase_24 | AC | 403 ms
36,668 KB |
testcase_25 | AC | 402 ms
36,832 KB |
testcase_26 | AC | 404 ms
36,828 KB |
testcase_27 | AC | 403 ms
36,880 KB |
testcase_28 | AC | 403 ms
36,792 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define int long long #define stoi stoll using pii=pair<int,int>; using vi = vector<int>; using vvi = vector<vi>; #define all(c) begin(c),end(c) #define rall(c) rbegin(c),rend(c) #define fore(x,c) for(auto &&x:c) #define rep(i,a,n) for(int i=a,i##len=(int)(n);i<i##len;++i) #define rrep(i, a, n) for(int i=(int)(n-1);i>=a;--i) #define sz(c) ((int)c.size()) #define contains(c,x) (c.find(x)!=end(c)) #define inseg(l,x,r) ((l)<=(x)&&(x)<(r)) #define dump(...) #define pb push_back #define _ 0 const signed INF_=1001001001; const long long INF=1001001001001001001LL; const int DX[9]={0,1,0,-1,1,1,-1,-1,0},DY[9]={-1,0,1,0,-1,1,1,-1,0}; template<class T> ostream& operator<<(ostream &os,const vector<T> &v) { for (auto i = begin(v); i != end(v); i++) os<<*i<<(i==end(v)-1?"":" ");return os;} template<class T> istream& operator>>(istream &is,vector<T> &v) { for (auto i = begin(v); i != end(v); i++) is>>*i;return is;} template<class T,class U> istream& operator>>(istream &is, pair<T,U> &p) { is>>p.first>>p.second;return is;} template<class T, class U> bool chmax(T &a,const U &b){return a<b?a=b,1:0;} template<class T, class U> bool chmin(T &a,const U &b){return a>b?a=b,1:0;} template <class T> void psum(T& c) {partial_sum(begin(c), end(c), begin(c));} template<class T> using heap=priority_queue<T,vector<T>,greater<T>>; struct before_main_function { before_main_function() { cin.tie(nullptr); ios::sync_with_stdio(0); cout << setprecision(15) << fixed; // #define endl "\n" } } before_main_function; //------------------8<------------------------------------8<-------------------- void dump_impl(string s) { assert(s.empty()); } template <class H, class... T> void dump_impl(string s, const H &head, const T&... tail) { int par = 0; rep(i, 0, sz(s)) { char ch = s[i]; if (ch == ',' && par == 0) { cerr << " = " << head << ", "; dump_impl(s.substr(i + 1), tail...); return; } else { cerr << ch; if (ch == '(') par++; if (ch == ')') par--; } } } #ifdef dump #undef dump #endif #define dump(...) do { cerr << "\x1b[33;1m"; dump_impl(#__VA_ARGS__ ",", __VA_ARGS__); cerr << "\x1b[0m" << endl; } while (0) template <int mod> class ModInt { public: ModInt() : v(0) {} ModInt(int x) : v((x+mod)%mod) {} int value() const {return v;} const ModInt operator+(const ModInt &r) const { return ModInt(this->v + r.v); } const ModInt operator-(const ModInt &r) const { return ModInt(this->v + mod - r.v); } const ModInt operator*(const ModInt &r) const { return ModInt(this->v * r.v); } const ModInt operator/(const ModInt &r) const { return (*this * (~r)); } const ModInt operator^(int k) const { return ModInt(bpow(this->v, k)); } const ModInt operator~() const { return ModInt(bpow(this->v, mod-2)); } bool operator==(const ModInt &r) const { return this->v == r.v; } bool operator!=(const ModInt &r) const { return this->v != r.v; } ModInt& operator+=(const ModInt &r) { return *this = *this + r; } ModInt& operator-=(const ModInt &r) { return *this = *this - r; } ModInt& operator*=(const ModInt &r) { return *this = *this * r; } ModInt& operator/=(const ModInt &r) { return *this = *this * (~r); } private: int v; int bpow(int a, int b) const { int ret = 1; while (b > 0) { if (b & 1) ret = (ret * a) % mod; a = (a * a) % mod; b >>= 1; } return ret; } }; using Mint = ModInt<1000000007>; ostream& operator<<(ostream &os,Mint v) { os<<v.value(); return os; } struct Factorial { static constexpr int MAX_N = 2000006; vector<Mint> fact, fact_inv; Factorial(size_t size = MAX_N) : fact(size), fact_inv(size) { fact[0] = fact_inv[0] = 1; for (int i = 1; i < MAX_N; ++i) { fact[i] = fact[i - 1] * i; fact_inv[i] = ~fact[i]; } } Mint combination(int N, int R) { if (N < 0 || R < 0) return 0; if (N < R) return 0; return fact[N] * fact_inv[N - R] * fact_inv[R]; } static Mint bin_pow(Mint x, int p) { if (x.value() == 0) return x; Mint prod = 1; while (p > 0) { if (p & 1) prod *= x; x *= x; p >>= 1; } return prod; } }; signed main() { int a, b, c; cin >> a >> b >> c; int n = a + b + c; Factorial fact; vector<Mint> sum(n + 1, 0); rep(y_len, b + c, n) { sum[y_len] = fact.combination((y_len - c) - 1, b - 1); } psum(sum); Mint ans = 0; rep(z_len, c, n - 1) { Mint tot = ((Mint(2) ^ (z_len - 1)) - Mint(1)); Mint way = fact.combination(z_len - 2, c - 2); Mint tmp = (Mint(2) ^ (z_len - 1)) * fact.combination(z_len - 1, c - 1) + tot * way; tmp *= sum[n - 1] - sum[z_len]; ans += tmp; } cout << ans.value() << endl; return 0; }