結果

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

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
0sample00.txt AC 3 ms
1,504 KB
0sample01.txt AC 4 ms
1,504 KB
0sample02.txt AC 3 ms
1,516 KB
1small00.txt AC 3 ms
1,508 KB
1small01.txt AC 3 ms
1,504 KB
1small02.txt AC 4 ms
1,504 KB
1small03.txt AC 3 ms
1,512 KB
1small04.txt AC 4 ms
1,504 KB
2medium00.txt AC 4 ms
1,524 KB
2medium01.txt AC 4 ms
1,520 KB
2medium02.txt AC 4 ms
1,524 KB
2medium03.txt AC 4 ms
1,528 KB
2medium04.txt AC 4 ms
1,524 KB
3large00.txt AC 31 ms
2,616 KB
3large01.txt AC 69 ms
2,620 KB
3large02.txt AC 71 ms
2,880 KB
3large03.txt AC 45 ms
2,620 KB
3large04.txt AC 13 ms
2,620 KB
3large05.txt AC 81 ms
3,676 KB
3large06.txt AC 81 ms
3,672 KB
3large07.txt AC 81 ms
3,672 KB
3large08.txt AC 82 ms
3,676 KB
3large09.txt AC 81 ms
3,676 KB
3large10.txt AC 82 ms
3,676 KB
3large11.txt AC 81 ms
3,672 KB
3large12.txt AC 81 ms
3,672 KB
3large13.txt AC 81 ms
3,672 KB
3large14.txt AC 81 ms
3,672 KB
3large15.txt AC 82 ms
3,676 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;

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