之前比赛以为是组合数,结果没写出来,然后手推规律,发现有个2的幂,但是不知道0的情况怎么解决,没想到打表。。
首先暴力打了个表:
#include <bits/stdc++.h>
using namespace std;
const int mod=1000000007;
const int MAXN = 15;
int n, m, k;
int ans;
int a[MAXN][MAXN];
bool check()
{
int x=1, y=1;
// for(int i=1;i<=n;++i)
// {
// for(int j=1;j<=m;++j)
// printf("%d%c", a[i][j],j==m?'\n':' ');
// }
for(int i=1;i<=n;++i)
{
x=1;
for(int j=1;j<=m;++j)
{
x*=a[i][j];
}
if(x!=k)
return false;
}
for(int i=1;i<=m;++i)
{
y=1;
for(int j=1;j<=n;++j)
{
y*=a[j][i];
}
if(y!=k)
return false;
}
return true;
}
void dfs(int x, int y)
{
if(x==n+1)
{
if(check())
ans++;
return ;
}
a[x][y]=1;
if(y+1>m)
dfs(x+1,1);
else
dfs(x,y+1);
a[x][y]=-1;
if(y+1>m)
dfs(x+1,1);
else
dfs(x,y+1);
return ;
}
int main()
{
while(~scanf("%d %d %d", &n, &m, &k))
{
memset(a,0,sizeof(a));
ans=0;
dfs(1,1);
printf("%d\n", ans);
}
return 0;
}
发现有一个2的幂的倍数,然后如果k=-1并且两个数互为奇偶,那么就是0
判断两个数互为奇偶 (a^b)&1
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
const int mod = 1e9+7;
typedef long long LL;
LL n, m, k;
LL quick_pow(LL a, LL b)
{
LL ans=1;
while(b)
{
if(b&1)
ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans%mod;
}
int main()
{
scanf("%lld %lld %lld", &n, &m, &k);
if(k==-1)
if((n&1)!=(m&1))
{
puts("0");
return 0;
}
printf("%lld\n", quick_pow(quick_pow(2,n-1),m-1));
return 0;
}