BZOJ4563 [Haoi2016]放棋子
2016-04-30 13:10
260 查看
每行每列有一个障碍,所以我们发现任意交换两行或者两列对答案没有影响,不妨把障碍交换到主对角线位置,就变成了语法百题的错排问题
设f[i]表示i个人的错排方案数
f[0]=1
f[1]=0
f[i]=(f[i-1]+f[i-2])*(i-1)
考虑地i个人怎么换,一种方法是与前i-1个人里的一个互换,这是f[i-2]*(i-1),另一种是拿第j个人的,并且第j个人不拿i的,在不考虑i的情况下第j个人不拿i与第j个人不拿j是等价的,所以就是f[i-1]*(i-1)
需要高精
设f[i]表示i个人的错排方案数
f[0]=1
f[1]=0
f[i]=(f[i-1]+f[i-2])*(i-1)
考虑地i个人怎么换,一种方法是与前i-1个人里的一个互换,这是f[i-2]*(i-1),另一种是拿第j个人的,并且第j个人不拿i的,在不考虑i的情况下第j个人不拿i与第j个人不拿j是等价的,所以就是f[i-1]*(i-1)
需要高精
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<iomanip> #include<vector> #include<stack> #include<queue> #include<map> #include<set> #include<bitset> using namespace std; #define MAXN 2010 #define MAXM 1010 #define ll long long #define INF 1000000000 #define MOD 1000000007 #define eps 1e-8 struct bn{ int x[MAXN]; int n; bn(){ memset(x,0,sizeof(x)); n=0; } friend bn operator +(bn &x,bn &y){ bn z; int i; z.n=max(x.n,y.n); for(i=1;i<=z.n;i++){ z.x[i]+=x.x[i]+y.x[i]; z.x[i+1]+=z.x[i]/10; z.x[i]%=10; } while(z.x[z.n+1]){ z.n++; z.x[z.n+1]+=z.x[z.n]/10; z.x[z.n]%=10; } return z; } friend bn operator *(bn &x,int y){ bn z; int i; z.n=x.n; for(i=1;i<=z.n;i++){ z.x[i]+=x.x[i]*y; z.x[i+1]+=z.x[i]/10; z.x[i]%=10; } while(z.x[z.n+1]){ z.n++; z.x[z.n+1]+=z.x[z.n]/10; z.x[z.n]%=10; } return z; } }; int n; bn f[210]; int main(){ int i; scanf("%d",&n); f[0].n=1; f[1].n=1; f[0].x[1]=1; f[1].x[1]=0; for(i=2;i<=n;i++){ f[i]=(f[i-1]+f[i-2]); f[i]=f[i]*(i-1); } for(i=f .n;i;i--){ printf("%d",int(f .x[i])); } printf("\n"); return 0; } /* */
相关文章推荐
- C++异常处理
- 【LeetCode】Valid Anagram 解题报告
- iBoxDB的学习与使用
- HTML5 - 地理定位
- 【转】C语言的位运算的优势
- 百问百答之Java容器篇
- 扒网页内容
- 基本数据类型,文件操作
- Linux下用eclipse查看opencv源码
- I方法怎么不能获取多选框的数据
- ListView封装实现下拉刷新和上拉加载(方式1)
- js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
- Linux中gcc和cc的版本不一致的解决办法
- CollectionView实现瀑布流布局
- 【模板】可并堆
- POJ-1062-昂贵的聘礼
- Java NIO Channel与Buffer的概述
- 深入理解ArrayList
- 装饰器模式
- 基于Boost方法的人脸检测(5):在一张图片中检测人脸