BZOJ 4563: [Haoi2016]放棋子

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

考虑经典的二分图做法,然后就变成求二分图完美匹配的个数了

显然不会做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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值