考虑经典的二分图做法,然后就变成求二分图完美匹配的个数了
显然不会做QAQ
由于障碍的特殊性,不妨把每个障碍都放到主对角线上,发现对答案没有影响
于是就变成错排计数了
高精度搞一搞就好了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
#define mmt(a,v) memset(a,v,sizeof(a))
#define tra(i,u) for(int i=head[u];i;i=e[i].next)
using namespace std;
typedef long long ll;
const int N=200+5;
const int base=1e6;
struct bigint{
int a[1000];
void clr(){mmt(a,0);}
void set(int x){while(x)a[++a[0]]=x%base,x/=base;}
void print(){printf("%d",a[a[0]]);per(i,a[0]-1,1)printf("%06d",a[i]);puts("");}
bigint operator + (bigint &b){
static bigint c;
c.clr();
c.a[0]=max(a[0],b.a[0])+1;
rep(i,1,c.a[0])
c.a[i]+=a[i]+b.a[i],c.a[i+1]+=c.a[i]/base,c.a[i]%=base;
if(!c.a[c.a[0]])c.a[0]--;
return c;
}
bigint operator * (int x){
static bigint b;
b.clr();
rep(i,1,a[0])b.a[i]=a[i]*x;
rep(i,1,a[0])b.a[i+1]+=b.a[i]/base,b.a[i]%=base;
while(b.a[b.a[0]+1]){
b.a[0]++;
b.a[b.a[0]+1]+=b.a[b.a[0]]/base;
b.a[b.a[0]]%=base;
}
return b;
}
void operator = (int x){set(x);}
}f[N];
int main(){
//freopen("a.in","r",stdin);
int n;scanf("%d",&n);
f[0]=1;f[1]=0;
rep(i,2,n)f[i]=f[i-1]+f[i-2],f[i]=f[i]*(i-1);
f[n].print();
return 0;
}

本文介绍了一种利用错排计数解决二分图完美匹配数量问题的方法,并通过高精度计算处理大数运算,确保准确性。文章提供了一个具体的C++实现案例。
1683

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



