刚 开 始 看 真 的 束 手 无 策 啊 刚开始看真的束手无策啊 刚开始看真的束手无策啊
但 是 ! 我 们 发 现 k 很 特 殊 , 只 是 1 和 − 1 但是!我们发现k很特殊,只是1和-1 但是!我们发现k很特殊,只是1和−1
所 以 对 应 的 , 每 个 格 子 只 能 填 1 或 − 1 , 而 且 乘 起 来 不 是 1 就 是 − 1 所以对应的,每个格子只能填1或-1,而且乘起来不是1就是-1 所以对应的,每个格子只能填1或−1,而且乘起来不是1就是−1
如 果 当 前 行 填 的 只 剩 最 后 一 个 , 那 么 当 前 乘 积 乘 起 来 不 是 1 就 是 − 1 如果当前行填的只剩最后一个,那么当前乘积乘起来不是1就是-1 如果当前行填的只剩最后一个,那么当前乘积乘起来不是1就是−1
在 k 确 定 的 情 况 下 , 其 实 最 后 的 格 子 确 定 了 在k确定的情况下,其实最后的格子确定了 在k确定的情况下,其实最后的格子确定了
当 前 列 也 是 同 样 的 情 况 当前列也是同样的情况 当前列也是同样的情况
所 以 ! ! 对 于 n 行 m 列 的 矩 阵 , 可 以 把 左 上 角 的 n − 1 行 m − 1 列 矩 阵 随 意 填 掉 所以!!对于n行m列的矩阵,可以把左上角的n-1行m-1列矩阵随意填掉 所以!!对于n行m列的矩阵,可以把左上角的n−1行m−1列矩阵随意填掉
此 时 方 案 是 2 ( n − 1 ) ( m − 1 ) , 那 么 接 下 来 的 第 n 行 和 第 m 列 的 填 法 固 定 了 此时方案是2^{(n-1)(m-1)},那么接下来的第n行和第m列的填法固定了 此时方案是2(n−1)(m−1),那么接下来的第n行和第m列的填法固定了
但 是 ! ! 当 n + m 是 奇 数 且 k = − 1 时 是 无 解 的 , 设 n 是 奇 数 , 那 么 m 是 偶 数 \color{Red}但是!!当n+m是奇数且k=-1时是无解的,设n是奇数,那么m是偶数 但是!!当n+m是奇数且k=−1时是无解的,设n是奇数,那么m是偶数
因 为 对 于 行 n 来 说 , 每 行 填 奇 数 个 − 1 , 那 么 − 1 的 总 数 是 偶 数 因为对于行n来说,每行填奇数个-1,那么-1的总数是偶数 因为对于行n来说,每行填奇数个−1,那么−1的总数是偶数
对 于 列 m 来 说 , 每 列 填 奇 数 个 − 1 , 那 么 − 1 总 数 是 奇 数 , 矛 盾 。 对于列m来说,每列填奇数个-1,那么-1总数是奇数,矛盾。 对于列m来说,每列填奇数个−1,那么−1总数是奇数,矛盾。
#include
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll n,m,k;
ll quick_pow(ll a,ll n)
{
ll ans=1;
while(n)
{
if(n&1) ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}return ans;
}
int main()
{
cin>>n>>m>>k;
if( ( n+m ) % 2 == 1 && k == -1 ) cout<<0;
else
{
ll ans=quick_pow(2,n-1);
cout<