题面

luogu

题解

裸的错排问题

错排问题

百度百科:\(n\)个有序的元素应有\(n!\)个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排;有的叫重排。如,1 2的错排是唯一的,即2 1。1 2 3的错排有3 1 2,2 3 1。这二者可以看作是1 2错排,3分别与1、2换位而得的。

错排公式:\(D(n) = (n-1)*(D(n-1)+D(n-2))\)

这里给出解释:

对于错排可以看作连线

A B ...... C

a b ...... c

\(A\)不能连\(a\),

同理,\(B\)不能连\(b\),\(C\)不能连\(c\)

考虑\(c\)连线

有\((n-1)\)种方案

假设\(A-c\)

那么考虑\(a\)如何连

1.如果\(C-a\)那么剩下的又是一个错排,即\(D(n-2)\)

2.如果\(a\)不连\(C\), 那么也可以构成一个错排,即\(D(n-1)\)

问题转换

如何转换成错排问题呢?

因为每行每列都只有一个棋子,且不能放在障碍上。

那么可以看作对障碍的错排

然后就是高精度板子了

Code

#include<bits/stdc++.h>

#define LL long long
#define RG register using namespace std;
template<class T> inline void read(T &x) {
x = 0; RG char c = getchar(); bool f = 0;
while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;
while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();
x = f ? -x : x;
return ;
}
template<class T> inline void write(T x) {
if (!x) {putchar(48);return ;}
if (x < 0) x = -x, putchar('-');
int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;
for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;
}
const int N = 10005;
struct node {
int s[N], cnt;
node(){
memset(s, 0, sizeof(s)); cnt = 0;
}
node operator + (node z) const {
node tmp;
tmp.cnt = max(cnt, z.cnt);
for (int i = 0; i < tmp.cnt; i++)
tmp.s[i] = s[i]+z.s[i];
for (int i = 0; i < tmp.cnt; i++)
if (tmp.s[i] > 9) {
tmp.s[i+1] += tmp.s[i]/10;
if (i+1 == tmp.cnt) tmp.cnt++;
tmp.s[i] %= 10;
}
return tmp;
}
node operator * (int z) const {
node tmp;
tmp.cnt = cnt;
for (int i = 0; i < tmp.cnt; i++)
tmp.s[i] = s[i]*z;
for (int i = 0; i < tmp.cnt; i++)
if (tmp.s[i] > 9) {
tmp.s[i+1] += tmp.s[i]/10;
if (i+1 == tmp.cnt) tmp.cnt++;
tmp.s[i] %= 10;
}
return tmp;
}
}; node D[210]; int main() {
int n;
read(n);
D[2].s[0] = D[2].cnt = D[1].cnt = 1;
for (int i = 3; i <= n; i++)
D[i] = (D[i-1]+D[i-2])*(i-1);
for (int i = D[n].cnt-1; i >= 0; i--)
printf("%d", D[n].s[i]);
return 0;
}

洛谷 P3182 [HAOI2016]放棋子(错排问题)的更多相关文章

  1. 洛谷P3182 [HAOI2016]放棋子

    P3182 [HAOI2016]放棋子 题目描述 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要 ...

  2. 洛谷 P3182 [HAOI2016]放棋子(高精度,错排问题)

    传送门 解题思路 不会错排问题的请移步——错排问题 && 洛谷 P1595 信封问题 这一道题其实就是求对于每一行的每一个棋子都放在没有障碍的地方的方案数. 因为障碍是每行.每列只有一 ...

  3. 【BZOJ4563】[Haoi2016]放棋子 错排+高精度

    [BZOJ4563][Haoi2016]放棋子 Description 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍 ...

  4. bzoj4563: [Haoi2016]放棋子(错排+高精)

    4563: [Haoi2016]放棋子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 387  Solved: 247[Submit][Status] ...

  5. [洛谷P3158] [CQOI2011]放棋子

    洛谷题目链接:[CQOI2011]放棋子 题目描述 在一个m行n列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同 颜色的棋子不能在同一行或者同一列.有多少祌方法?例如,n=m=3,有两个 ...

  6. 洛谷P3158 [CQOI2011]放棋子 组合数学+DP

    题意:在一个m行n列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列.有多少祌方法? 解法:这道题不会做,太菜了qwq.题解是看洛谷大佬的. 设C是组合数, ...

  7. 洛谷P1595 信封问题 题解 错排问题

    作者:zifeiy 标签:排列组合,错排问题 题目链接:https://www.luogu.org/problem/P1595 题目描述:某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都 ...

  8. JZYZOJ1544 [haoi2016T2]放棋子 错排公式 组合数学 高精度

    http://172.20.6.3/Problem_Show.asp?ID=1544&a=ProbNF 看了题解才意识到原题有错排的性质(开始根本不知道错排是什么). 十本不同的书放在书架上. ...

  9. [Haoi2016]放棋子 题解

    4563: [Haoi2016]放棋子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 440  Solved: 285[Submit][Status] ...

随机推荐

  1. 虚拟机安装CentOS以及SecureCRT设置【完美无错版】

    一.CentOS简介 CentOS是Linux的发行版之一,它安全.稳定.高效,是我最喜欢的Linux发行版之一.CentOS根据Red Hat Enterprise Linux开放源代码编译而成,与 ...

  2. Java,Calendar -- 获取当前日期、当月月初日期、月末日期

    public class CalendarTest { public static void main(String[] args) { // 获取当前年份.月份.日期 Calendar cale = ...

  3. (二)在eclipse中使用maven

    二.配置Maven插件 2.1.配置使用的Maven

  4. ubuntu18.04 按住只能删除一个字符bug

    只需要打开重复按键就可以了

  5. WebFlux01 webflux概念、异步servlet、WebFlux意义

    1 概念 待更新...... 2 异步servlet 2.1 同步servlet servlet容器(如tomcat)里面,每处理一个请求会占用一个线程,同步servlet里面,业务代码处理多久,se ...

  6. 新浪SAE高级开发者认证通过

    如题,新浪SAE高级开发者认证通过,申请的方式为提交开源项目地址,用的是如下的项目 http://jqext.sinaapp.com/ 之前该项目是部署在 mopaas 上的,在拿到高级开发者资格后迁 ...

  7. cakephp中sql查询in

    $list = $this->Capital->find('all', array('conditions'=>array('remark in '=>array('银联支付' ...

  8. Shiro——认证概述

    认证流程 身份认证流程 首先调用 Subject.login(token) 进行登录,其会自动委托给SecurityManager SecurityManager 负责真正的身份验证逻辑:它会委托给A ...

  9. The user specified as a definer (”@sa’%') does not exist 解决方法

    mysql数据库报错The user specified as a definer (”@sa’%') does not exist.尝试过两种方式,第一种重启之后好用,但是一会就又不好用了.第二种算 ...

  10. C# 世界坐标 页面坐标 PageUnit PageScale

    PageScale:  获取或设置此 Graphics 的世界单位和页单位之间的比例.PageUnit:  获取或设置用于此 Graphics 中的页坐标的度量单位. 话不多说,上代码: privat ...