제출 #21999

#제출 시각아이디문제언어결과실행 시간메모리
21999gs14004흑백 (kriii4_G)C++11
100 / 100
366 ms33284 KiB
#include <bits/stdc++.h> using namespace std; typedef long long lint; typedef pair<int, int> pi; const int mod = 1e9 + 7; lint ipow(lint x, lint p){ lint ret = 1, piv = x % mod; while(p){ if(p&1) ret *= piv; piv *= piv; ret %= mod; piv %= mod; p >>= 1; } return ret % mod; } lint pwr[2000005], ipw[2000005]; lint fact[1005], invf[1005]; int n, m; lint ncr(int x, int y){ if(y < 0 || x < y) return 0; return fact[x] * (invf[y] * invf[x-y] % mod) % mod; } lint solve(int n, int m){ lint ans = 0; for(int i=1; i<=n; i++){ for(int k=1; k+i<=n; k++){ ans += (ncr(n, i) * ncr(n-i, k) % mod) * ((ipow(ipw[i] + 1, m) - 1) * (ipow(ipw[k] + 1, m) - 1) % mod) % mod; } } return ans; } lint solve2(){ lint ans = 0; for(int i=1; i<=n; i++){ for(int j=1; j+i<=n; j++){ lint aux = ipow(ipw[j] + 1, m) * (ipow((ipw[i] * ipow(ipw[j] + 1, mod - 2) + 1) % mod, m) + mod - 1) % mod; aux -= ipow(ipw[i] + 1, m) - 1; aux += mod; aux %= mod; ans += (ncr(n, i) * ncr(n-i, j) % mod) * aux; ans %= mod; } } return ans; } int main(){ cin >> n >> m; pwr[0] = ipw[0] = 1; for(int i=1; i<=n*m*2; i++){ pwr[i] = pwr[i-1] * 2 % mod; ipw[i] = ipw[i-1] * ((mod + 1) / 2) % mod; } fact[0] = invf[0] = 1; for(int i=1; i<=max(n, m); i++){ fact[i] = fact[i-1] * i % mod; invf[i] = ipow(fact[i], mod-2); } lint x = solve(n, m) + solve(m, n) - solve2() + mod; cout << x % mod; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...