题目描述
http://codeforces.com/problemset/problem/894/B
简要题意:给定一个 $n\times m$ 的矩形,要求在每个位置填 $0$ 或 $1$,要求每一行和每一列的异或和都是 $k$,求方案数
$1\le n,m\le 10^{18}$
Solution
注意到我们前 $n-1$ 行 $m-1$ 列无论怎么填,最后一行和最后一列都能选择对应的数字满足条件
需要注意的是如果 $|n-m|$ 是奇数且 $k=-1$ 的情况是无解的
其他情况下答案就是 $2^{(n-1)\times (m-1)}$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include <iostream> #define ll long long using namespace std;
const int p = 1000000007;
ll pow_mod(ll x, ll n) { ll s = 1; for (; n; n >>= 1, x = x * x % p) if (n & 1) s = s * x % p; return s; }
ll n, m, k;
int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> m >> k; if ((abs(n - m) & 1) && k == -1) return cout << 0 << "\n", 0; cout << pow_mod(pow_mod(2, n - 1), m - 1) << "\n"; return 0; }
|