結果

問題 No.895 MESE
ユーザー FF256grhy
提出日時 2019-09-28 06:57:39
言語 C++14
(gcc 8.3.0)
結果
AC  
実行時間 81 ms
コード長 4,327 Byte
コンパイル時間 1,373 ms
使用メモリ 3,852 KB
最終ジャッジ日時 2019-11-18 10:54:14

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
0sample00.txt AC 8 ms
3,848 KB
0sample01.txt AC 7 ms
3,848 KB
0sample02.txt AC 6 ms
3,852 KB
1small00.txt AC 6 ms
3,852 KB
1small01.txt AC 5 ms
3,852 KB
1small02.txt AC 7 ms
3,848 KB
1small03.txt AC 7 ms
3,848 KB
1small04.txt AC 7 ms
3,848 KB
2medium00.txt AC 7 ms
3,848 KB
2medium01.txt AC 8 ms
3,848 KB
2medium02.txt AC 7 ms
3,852 KB
2medium03.txt AC 7 ms
3,852 KB
2medium04.txt AC 7 ms
3,848 KB
3large00.txt AC 31 ms
3,852 KB
3large01.txt AC 69 ms
3,852 KB
3large02.txt AC 72 ms
3,848 KB
3large03.txt AC 47 ms
3,848 KB
3large04.txt AC 14 ms
3,852 KB
3large05.txt AC 80 ms
3,852 KB
3large06.txt AC 81 ms
3,852 KB
3large07.txt AC 81 ms
3,852 KB
3large08.txt AC 81 ms
3,848 KB
3large09.txt AC 81 ms
3,852 KB
3large10.txt AC 80 ms
3,848 KB
3large11.txt AC 81 ms
3,848 KB
3large12.txt AC 81 ms
3,852 KB
3large13.txt AC 81 ms
3,852 KB
3large14.txt AC 80 ms
3,852 KB
3large15.txt AC 81 ms
3,848 KB
テストケース一括ダウンロード

ソースコード

diff #
#include <bits/stdc++.h>
using namespace std;
typedef long long   signed int LL;
typedef long long unsigned int LU;
#define incID(i, l, r) for(LL i = (l)    ; i <  (r); ++i)
#define incII(i, l, r) for(LL i = (l)    ; i <= (r); ++i)
#define decID(i, l, r) for(LL i = (r) - 1; i >= (l); --i)
#define decII(i, l, r) for(LL i = (r)    ; i >= (l); --i)
#define inc(i, n)  incID(i, 0, n)
#define inc1(i, n) incII(i, 1, n)
#define dec(i, n)  decID(i, 0, n)
#define dec1(i, n) decII(i, 1, n)
#define inID(v, l, r) ((l) <= (v) && (v) <  (r))
#define inII(v, l, r) ((l) <= (v) && (v) <= (r))
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
#define  ALL(v)  v.begin(),  v.end()
#define RALL(v) v.rbegin(), v.rend()
template<typename T> bool setmin  (T & a, T b) { if(b <  a) { a = b; return true; } else { return false; } }
template<typename T> bool setmax  (T & a, T b) { if(b >  a) { a = b; return true; } else { return false; } }
template<typename T> bool setmineq(T & a, T b) { if(b <= a) { a = b; return true; } else { return false; } }
template<typename T> bool setmaxeq(T & a, T b) { if(b >= a) { a = b; return true; } else { return false; } }
LL mo(LL a, LL b) { assert(b > 0); a %= b; if(a < 0) { a += b; } return a; }
LL fl(LL a, LL b) { assert(b > 0); return (a > 0 ? a / b : (a - b + 1) / b); }
LL ce(LL a, LL b) { assert(b > 0); return (a < 0 ? a / b : (a + b - 1) / b); }
template<typename T> T gcd(T a, T b) { return (b == 0 ? a : gcd(b, a % b)); }
template<typename T> T lcm(T a, T b) { return a / gcd(a, b) * b; }
#define bit(b, i) (((b) >> (i)) & 1)
#define BC __builtin_popcountll
#define SC static_cast
#define SI(v) SC<int>(v.size())
#define SL(v) SC<LL >(v.size())
#define RF(e, v) for(auto & e: v)
#define ef else if
#define UR assert(false)

// ---- ----

template<LL M> class ModInt {
private:
	LL v = 0;
public:
	ModInt() { }
	ModInt(LL vv) { setval(vv); }
	ModInt & setval(LL vv) { v = vv % M; if(v < 0) { v += M; } return (*this); }
	LL getval() const { return v; }
	ModInt & operator+=(const ModInt & b)       { return setval(v + b.v); }
	ModInt & operator-=(const ModInt & b)       { return setval(v - b.v); }
	ModInt & operator*=(const ModInt & b)       { return setval(v * b.v); }
	ModInt & operator/=(const ModInt & b)       { return setval(v * b.inv()); }
	ModInt & operator^=(            LU b)       { return setval(ex(v, b)); }
	ModInt   operator+ (                ) const { return ModInt(+v); }
	ModInt   operator- (                ) const { return ModInt(-v); }
	ModInt   operator+ (const ModInt & b) const { return ModInt(v + b.v); }
	ModInt   operator- (const ModInt & b) const { return ModInt(v - b.v); }
	ModInt   operator* (const ModInt & b) const { return ModInt(v * b.v); }
	ModInt   operator/ (const ModInt & b) const { return ModInt(v * b.inv()); }
	ModInt   operator^ (            LU b) const { return ModInt(ex(v, b)); }
	LL inv() const {
		LL x = (ex_gcd(v, M).FI + M) % M;
		assert(v * x % M == 1);
		return x;
	}
	LL ex(LL a, LU b) const {
		LL D = 64, x[64], y = 1;
		inc(i, D) { if((b >> i) == 0) { D = i; break; } }
		inc(i, D) { x[i] = (i == 0 ? a : x[i - 1] * x[i - 1]) % M; }
		inc(i, D) { if((b >> i) & 1) { (y *= x[i]) %= M; } }
		return y;
	}
	pair<LL, LL> ex_gcd(LL a, LL b) const {
		if(b == 0) { return MP(1, 0); }
		auto p = ex_gcd(b, a % b);
		return MP(p.SE, p.FI - (a / b) * p.SE);
	}
};
template<LL M> ModInt<M> operator+(LL a, const ModInt<M> & b) { return  b + a; }
template<LL M> ModInt<M> operator-(LL a, const ModInt<M> & b) { return -b + a; }
template<LL M> ModInt<M> operator*(LL a, const ModInt<M> & b) { return  b * a; }
template<LL M> ModInt<M> operator/(LL a, const ModInt<M> & b) { return  a * b.inv(); }
template<LL M> istream & operator>>(istream & is, ModInt<M> & b) { LL v; is >> v; b.setval(v); return is; }
template<LL M> ostream & operator<<(ostream & os, const ModInt<M> & b) { return (os << b.getval()); }

// ---- ----

typedef ModInt<1'000'000'007> MI;

const int M = 300000;
MI a, b, c, f[M + 1];

int main() {
	LL a, b, c;
	cin >> a >> b >> c;
	a--;
	b--;
	
	incII(i, 0, M) { f[i] = (i == 0 ? 1 : f[i - 1] * i); }
	
	MI ans = 0;
	incII(i, 0, a) {
		LL s = (a - i) + b + c;
		ans += f[s] / (f[a - i] * f[b] * f[c]) * ((MI(2) ^ s) - 1) * (MI(c) / s);
	}
	
	cout << ans << endl;
	
	return 0;
}
0