我们定义一个矩阵为“好矩阵”,当且仅当该矩阵所有2*2的子矩阵数字和为偶数。
例如:
是好矩阵,两个2*2的子矩阵的和分别是8和12。
请问行列,矩阵中每个数均在范围内的好矩阵有多少种?由于答案过大,请对取模。
数据范围:
保证为偶数。
保证为偶数。
class Solution { public: int mod = 1e9 + 7; int func(long long a, long long b) { long long res = 1; while (b) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res % mod; } int numsOfGoodMatrix(int n, int m, int x) { long long a = n; a *= m; long long ans = func(x / 2, a); ans *= func(2, n + m - 1); ans %= mod; return ans; } };
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param n int整型 # @param m int整型 # @param x int整型 # @return int整型 # class Solution: def numsOfGoodMatrix(self, n: int, m: int, x: int) -> int: # write code here MOD = int(1e9 + 7) return pow(x >> 1, n*m, MOD)*pow(2, n + m - 1, MOD) % MOD
const mod int = 1e9 + 7 func qpow(x, n int) int { ans := 1 for n > 0 { if n&1 == 1 { ans = ans * x % mod } x = x * x % mod n >>= 1 } return ans } func numsOfGoodMatrix(n, m, x int) int { ans := qpow(x, m) * qpow(2, n - 1) % mod * qpow(x / 2, m * (n - 1)) % mod return ans }
#include <bits/stdc++.h> using namespace std; const int mod = 1e7; typedef long long LL; LL res = 0, n, m, x; LL f1[mod], f2[mod]; LL v1, v2; LL vs1[mod], vs2[mod]; LL C[mod]; int main() { cin >> n >> m >> x; v1 = (x % 2 == 0) ? x / 2 : x / 2 + 1; // 奇数 v2 = x / 2; C[0] = 1; for (int i=1;i<=m;i++) { for (int j=m;j>=1;j--) { C[j] = C[j] + C[j-1]; } } vs1[0] = vs2[0] = 1; for (int i = 1; i <= m; i++) { vs1[i] = vs1[i - 1] * v1; vs1[i] %= mod; vs2[i] = vs2[i - 1] * v2; vs2[i] %= mod; } for (int i = 0; i <= m; i++) { f1[i] = vs1[i] * vs2[m - i]; f1[i] %= mod; } for (int i = 2; i <= n; i++) { for (int j = 0; j<= m; j++) { f2[j] = f1[j] + f1[m - j]; f2[j] %= mod; f2[j] *= C[j]; f2[j] %= mod; } memcpy(f1, f2, sizeof f2); } for (int i = 0; i <= n; i++) { res += f1[i]; res %= mod; } cout << res; return 0; }