Description
a
和
Input
一个整数 n(1≤n≤16)
Output
输出方案数,结果模 109+7
Sample Input
3
Sample Output
18
Solution
首先固定
ai=i
,找到合法的
bi
方案数后答案乘
n!
即可,因为
n
很小所以直接暴搜合法
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
#define mod 1000000007
int ans[]={0,1,0,18,0,1800,0,670320,0,734832000,0,890786230,0,695720788,0,150347555,0};
int fact[22];
int num,m;
void dfs(int pos,int B,int C)
{
if(pos==m+1)
{
num++;
if(num>=mod)num-=mod;
return ;
}
for(int i=1;i<=m;i++)
if(!((1<<i)&B))
{
int j=(i-1+pos-1)%m+1;
if(!((1<<j)&C))
dfs(pos+1,B^(1<<i),C^(1<<j));
}
}
void init()
{
fact[0]=1;
for(int i=1;i<=16;i++)fact[i]=(ll)i*fact[i-1]%mod;
for(int i=1;i<=16;i++)
{
m=i,num=0;
dfs(1,0,0);
ans[i]=(ll)num*fact[i]%mod;
printf("%d,",ans[i]);
}
}
int main()
{
//init();
int n;
while(~scanf("%d",&n))printf("%d\n",ans[n]);
return 0;
}