题面

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. 数据结构》关于差分约束的两三事(BZOJ2330)

    差分约束,主要用来解决数学中的线性规划问题,通过差值与两个未知数可以转化为单源最长路问题(或负值最短路). 当有一个式子为x1-x2>=a时,我们可以建边,这条边设定为x1比x2大等a(或x2比 ...

  2. hp警告Creating default object from empty value 问题的解决方法

    hp警告Creating default object from empty value 问题的解决方法 解决方法是找到报错的位置然后看哪个变量是没有初始化而直接使用的,将这个变量先实例化一个空类.如 ...

  3. opennebula kvm 创建VM oned报错日志

    Thu Jul :: [ReM][D]: Req: UID: VirtualMachineDeploy result SUCCESS, Thu Jul :: [TM][D]: Message rece ...

  4. Glade编程

    一.简介 如果有一种软件能将图形界面的设计及时地展现于开发人员的面前,而且在设计完后能直接看到界面的外观效果,这样就使程序员的主要精力集中于应用程序核心功能的开发上,这就是所谓的可视化编程思想.   ...

  5. [GO]指针和函数配合的值传递

    package main import "fmt" func swap(a, b int) { a, b = b, a fmt.Printf("a = %d, b = % ...

  6. [GO]不同作用域的同名变量

    package main import "fmt" var a byte //这是一个全局变量 func main() { var a int //这是一个局部变量 //1.作用域 ...

  7. Densely Connected Convolutional Networks(緊密相連卷積網絡)

    - Dense blocks where each layer is connected to every other layer in feedforward fashion(緊密塊是指每一個層與每 ...

  8. [转]windows7远程桌面连接失败:发生身份验证错误。要求的函数不受支持

    转至:https://jingyan.baidu.com/article/d169e18604ca86436611d821.html 系统升级后出现远程连接报错,“发生身份验证错误.要求的函数不受支持 ...

  9. 【转】微信中MMAlert(半透明底部弹出菜单)的使用介绍

    原文地址:http://blog.csdn.net/singwhatiwanna/article/details/8892930 果大家时常用过微信或者用过iphone,就会发现有种从底部弹出的半透明 ...

  10. [转载] java中关于OOM的场景及解决方法

    1.OOM for Heap=>例如:java.lang.OutOfMemoryError: Java heapspace[分析] 此OOM是由于JVM中heap的最大值不满足需要,将设置hea ...