版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/78583092
题目链接:http://codeforces.com/contest/894/problem/B
解题思路:首先k^n要等于k^m,所以当k=-1时,n,m的奇偶性要相同,由于答案只有-1和1,就是意味着当一行中,前面所有的数选好之后,都可以根据最后一位来调节,那么就可以先对前m-1列和前n-1行进行填数,就有2^(n-1)*(m-1)种方案,乘积设为p,再对剩余的格子填数,因为k/(k^(m-1)/p)*(k^(n-1)/p)=k,所以剩下的数填好一定满足各行各列乘积为k
AC代码:
#include<iostream>
using namespace std;
typedef long long LL;
const int MOD = 1000000007;
LL quickPow(LL a, LL b,int mod)
{
LL ans = 1;
a = a%mod;
while (b)
{
if (b & 1) ans *= a, ans %= mod;
b >>= 1;
a *= a;
a %= mod;
}
return ans;
}
int main()
{
LL n, m, k;
cin >> n >> m >> k;
if (k == -1 && (n + m) % 2)
cout << 0 << endl;
else
{
LL ans = quickPow(2, n - 1, MOD);
ans = quickPow(ans, m - 1, MOD);
cout << ans << endl;
}
return 0;
}