제출 #57038

#제출 시각아이디문제언어결과실행 시간메모리
57038kjp4155Tents (JOI18_tents)C++11
100 / 100
473 ms287460 KiB
#include<bits/stdc++.h> using namespace std; #define VA_NUM_ARGS(...) VA_NUM_ARGS_IMPL_((0,__VA_ARGS__, 6,5,4,3,2,1)) #define VA_NUM_ARGS_IMPL_(tuple) VA_NUM_ARGS_IMPL tuple #define VA_NUM_ARGS_IMPL(_0,_1,_2,_3,_4,_5,_6,N,...) N #define macro_dispatcher(macro, ...) macro_dispatcher_(macro, VA_NUM_ARGS(__VA_ARGS__)) #define macro_dispatcher_(macro, nargs) macro_dispatcher__(macro, nargs) #define macro_dispatcher__(macro, nargs) macro_dispatcher___(macro, nargs) #define macro_dispatcher___(macro, nargs) macro ## nargs #define Debug1(a) cout<<#a<<"="<<(a)<<"\n" #define Debug2(a,b) cout<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<"\n" #define Debug3(a,b,c) cout<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<"\n" #define Debug4(a,b,c,d) cout<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<", "<<#d<<"="<<(d)<<"\n" #define Debug5(a,b,c,d,e) cout<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<", "<<#d<<"="<<(d)<<", "<<#e<<"="<<(e)<<"\n" #define Debug6(a,b,c,d,e,f) cout<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<", "<<#d<<"="<<(d)<<", "<<#e<<"="<<(e)<<", "<<#f<<"="<<(f)<<"\n" #define Debug(...) macro_dispatcher(Debug, __VA_ARGS__)(__VA_ARGS__) #define DA(a,n) cout<<#a<<"=["; printarray(a,n); cout<<"]\n" #define DAR(a,n,s) cout<<#a<<"["<<s<<"-"<<n-1<<"]=["; printarray(a,n,s); cout<<"]\n" #define TT1 template<class T> #define TT1T2 template<class T1, class T2> #define TT1T2T3 template<class T1, class T2, class T3> template<class T, size_t N> ostream& operator << (ostream& os, const array<T, N>& v); TT1T2 ostream& operator << (ostream& os, const pair<T1, T2>& p){ return os <<"("<<p.first<<", "<< p.second<<")"; } TT1 ostream& operator << (ostream& os, const vector<T>& v){ bool f=1;os<<"[";for(auto& i : v) { if (!f)os << ", ";os<<i;f=0;}return os << "]"; } template<class T, size_t N> ostream& operator << (ostream& os, const array<T, N>& v) { bool f=1;os<<"[";for(auto& i : v) { if (!f)os << ", ";os<<i;f=0;}return os << "]"; } TT1T2 ostream& operator << (ostream& os, const set<T1, T2>&v){ bool f=1;os<<"[";for(auto& i : v) { if (!f)os << ", ";os<<i;f=0;}return os << "]"; } TT1T2 ostream& operator << (ostream& os, const multiset<T1,T2>&v){bool f=1;os<<"[";for(auto& i : v) { if (!f)os << ", ";os<<i;f=0;}return os << "]"; } TT1T2T3 ostream& operator << (ostream& os, const map<T1,T2,T3>& v){ bool f = 1; os << "["; for (auto& ii : v) { if (!f)os << ", "; os << "(" << ii.first << " -> " << ii.second << ") "; f = 0; }return os << "]"; } TT1T2 ostream& operator << (ostream& os, const multimap<T1, T2>& v){ bool f = 1; os << "["; for (auto& ii : v) { if (!f)os << ", "; os << "(" << ii.first << " -> " << ii.second << ") "; f = 0; }return os << "]"; } TT1T2 ostream& operator << (ostream& os, priority_queue<T1, T2> v) { bool f = 1; os << "["; while (!v.empty()) { auto x = v.top(); v.pop(); if (!f) os << ", "; f = 0; os << x; } return os << "]"; } TT1T2 void printarray(const T1& a, T2 sz, T2 beg = 0){ for (T2 i = beg; i<sz; i++) cout << a[i] << " "; cout << endl; } typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> Pi; typedef pair<ll, ll> Pll; #define Fi first #define Se second #define pb(x) push_back(x) #define sz(x) (int)x.size() #define rep(i, n) for(int i=0;i<n;i++) #define repp(i, n) for(int i=1;i<=n;i++) #define all(x) x.begin(), x.end() #define geti1(X) cin >> X #define geti2(X,Y) cin >> X >> Y #define geti3(X,Y,Z) cin >> X >> Y >> Z #define geti4(X,Y,Z,W) cin >> X >> Y >> Z >> W #define GET_MACRO(_1,_2,_3,_4,NAME,...) NAME #define geti(...) GET_MACRO(__VA_ARGS__, geti4, geti3, geti2, geti1) (__VA_ARGS__) #define INF 987654321 #define endl '\n' const ll mod = 1e9 + 7; ll cdp[5000][5000], dp[5050][5050]; ll odd[6000], even[6000]; ll oddi[6000], eveni[6000]; ll fpow(ll a, ll b){ ll res = 1, t = a; while( b ){ if( b&1 ) res = (res*t)%mod; t = (t*t)%mod; b >>= 1; } return res; } ll inv(ll x){ return fpow(x,mod-2); } ll C(int n, int m){ if( n == m || m == 0 ) return 1; ll& res = cdp[n][m]; if( res != -1 ) return res; res = C(n-1,m) + C(n-1,m-1); res %= mod; return res; } int N,M; int main(){ memset(cdp,-1,sizeof cdp); geti(N,M); even[0] = 1; even[1] = 1; odd[0] = 1; odd[1] = 1; for(int i=2;i<=5000;i++) { if( i%2 == 0 ) even[i] = (even[i-1] * C(i,2)) % mod; else even[i] = even[i-1]; if( i%2 == 1 ) odd[i] = (odd[i-1] * C(i,2)) %mod; else odd[i] = odd[i-1]; } for(int i=0;i<=5000;i++){ eveni[i] = inv(even[i]); oddi[i] = inv(odd[i]); } for(int i=0;i<=5000;i++) dp[0][i] = dp[i][0] = 1; for(int i=1;i<=N;i++){ for(int j=1;j<=M;j++){ dp[i][j] = dp[i-1][j]; ll tmp = (4 * j) % mod; tmp = (tmp * dp[i-1][j-1]) % mod; dp[i][j] = (dp[i][j] + tmp) % mod; } } ll ans = 0; for(ll a=0;a<=N;a++) for(ll b=0;b<=M;b++){ if( N-a-2*b < 0 || M-b-2*a < 0 ) continue; ll tmp = ( C(N,a) * C(M,b) ) % mod; if( (M-b)%2 == 0 ){ tmp = ( tmp * even[M-b] ) % mod; tmp = ( tmp * eveni[M-b-2*a] ) % mod; } else{ tmp = ( tmp * odd[M-b] ) % mod; tmp = ( tmp * oddi[M-b-2*a] ) % mod; } if( (N-a)%2 == 0 ){ tmp = ( tmp * even[N-a] ) % mod; tmp = ( tmp * eveni[N-a-2*b] ) % mod; } else{ tmp = ( tmp * odd[N-a] ) % mod; tmp = ( tmp * oddi[N-a-2*b] ) % mod; } //for(int x = M-b; x >= M-b-2*(a-1); x-=2) tmp = ( tmp * C(x,2) ) % mod; //for(int x = N-a; x >= N-a-2*(b-1); x-=2) tmp = ( tmp * C(x,2) ) % mod; tmp = (tmp * dp[N-a-2*b][M-b-2*a]) % mod; ans = ( ans + tmp ) % mod; } ans = (ans - 1 + mod) % mod; cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...