Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- const int N = 2000000, mod = 1000000007;
- int cnt[2], target;
- long long fact[N];
- #define forn(i,n) for(int i = 0; i < (int) n; i++)
- #define sz(a) (int)(a).size()
- inline bool read() {
- return (cin >> cnt[0] >> cnt[1] >> target);
- }
- inline long long bpow(long long v, int power) {
- if (power == 0) return 1;
- if ((power & 1) == 0) {
- long long r = bpow(v, power >> 1);
- return (r * r) % mod;
- }
- return (bpow(v, power - 1) * v) % mod;
- }
- inline int getC(int n, int k) {
- long long nom = fact[n];
- long long den = (fact[n-k] * fact[k]) % mod;
- return (nom * bpow(den, mod - 2)) % mod;
- }
- int calculate() {
- if (cnt[1] == 0) {
- if (cnt[0] % 2 != target)
- return 1;
- else
- return 0;
- }
- if (cnt[0] == 0) {
- if (cnt[1] > 1) {
- if (target == 0)
- return 1;
- else
- return 0;
- } else {
- if (target == 1)
- return 1;
- else
- return 0;
- }
- }
- int answer = 0;
- for(int i = 0; i <= cnt[0]; i++) {
- int total = cnt[0] + cnt[1] - 1 - i;
- if (total > 0) {
- if (i % 2 == target) {
- answer += getC(total, cnt[1] - 1);
- if (answer >= mod) answer -= mod;
- }
- } else {
- if (i % 2 != target) {
- answer += getC(total, cnt[1] - 1);
- if (answer >= mod) answer -= mod;
- }
- }
- }
- return answer;
- }
- inline void solve() {
- fact[0] = 1;
- forn(i, N) {
- if (!i) continue;
- fact[i] = (fact[i-1] * i) % mod;
- }
- cout << calculate() << endl;
- }
- int main() {
- while (read())
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement