思路:先不考虑最后一行和最后一列,任意填充前(n-1)*(m-1)个格,那么最后一行和最后一列显然可以填上1或-1使得每行每列都等于k,那么右下角那个格子呢?设前(n-1)*(m-1)个格乘积为sum,对于列来说,右下角填上A=k^(n-1)*sum,对于行来说右下角填上B=k^(m-1)*sum。那么显然如果k=-1,且n和m奇偶性不同时A不等于B,其余情况都能满足。答案就是pow(2, (n-1)*(m-1)),范围太大用欧拉降幂。
# include <iostream>
# include <cstdio>
using namespace std;
typedef long long LL;
const LL mod = 1e9+7;
LL qmod(LL a, LL b)
{
LL ans = 1;
for(;b;b>>=1)
{
if(b&1) ans=ans*a%mod;
a=a*a%mod;
}
return ans;
}
int main()
{
LL n, m, k;
scanf("%lld%lld%lld",&n,&m,&k);
if(k == -1 && (n&1)!=(m&1)) return 0*puts("0");
n = (n-1)%(mod-1);
m = (m-1)%(mod-1);
printf("%lld\n",qmod(2LL,n*m%(mod-1)+mod-1));
return 0;
}
探讨如何用1和-1填满n*m的矩阵,确保每一行每一列的乘积为k,输出方案数并模1e9+7。通过分析矩阵填充规律,利用快速幂求解。

被折叠的 条评论
为什么被折叠?



