链接:https://ac.nowcoder.com/acm/problem/16407
来源:牛客网
题号:NC16407
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
托米老师靠才华与颜值发家致富后,开了一家航空公司,公司的口号是“您想飞,我们便做您的翅膀~让您每次飞行都有独特的体验!”
但是现在有一个小小的问题需要解决,托米家的飞机每排有M个座位,有N排座位。因此座椅形成了M × N的网格(忽略过道),公司为每次航班都出售K张票。
为了满足口号中的“翅膀”部分,座位必须遵守以下规则:座位被占用时,座位正前方和座位后方的座位以及当前座位左边和右边必须是空的(大概是因为这个飞机会很大吧,boss就是这么任性哼)。
然后为了满足口号中的“独特体验”部分。公司则是对每一趟航班飞机的座位采取不同的安排,如果这一趟的某个座位是占用的,而另一趟的座位是空的,则这两趟飞机座位安排是不同的。
给你三个数字M,N和K。
现在需要从这些座位中选出k个合法的座位。由于这个数字可能非常大,我们只求它对420047取模的结果。
输入描述:
输入的第一行包含一个整数T,表示指定测试用例的数量。 每个测试用例前面都有一个空白行。 每个测试用例由包含三个整数M,N和K的一行组成。
输出描述:
对于每个测试用例输出一行,表示答案对420047取模的结果。
示例1
输入
复制
3 2 3 2 2 4 4 2 5 1
输出
复制
8 2 10
备注:
T≤10 N*M<=80, K<=4
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
const int mod=420047;
typedef long long ll;
int k;
int ans;
int m,n;
int s[90][90];
void dfs(int a,int b){
if(b==k) {
ans++;
return;
}
for(int i=a+1;i<=m*n;i++){
int x=(i-1)/m+1;
int y=(i-1)%m+1;
if(s[x-1][y]==0&&s[x][y-1]==0){
s[x][y]=1;
dfs(i,b+1);
s[x][y]=0;
}
}
}
//bool is(long long x){
// if(x<=2) return true;
// for(long long i=2;i*i<x;i++){
// if(x%i==0) return false;
// }
// return true;
//}
//ll f(int x){
// if(x<2) return x;
// return (f(x/2)+f(x%2));
//}
int main(){
int t;
cin>>t;
while(t--){
ans=0;
cin>>m>>n>>k;
memset(s, 0, sizeof(s));
dfs(0,0);
cout<<ans%mod<<endl;
}
}