4563: [Haoi2016]放棋子

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 440  Solved: 285
[Submit][Status][Discuss]

Description

给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在
这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子也满足每行只有一枚棋子,每列只有一枚棋子
的限制,求有多少种方案。
 

Input

第一行一个N,接下来一个N*N的矩阵。N<=200,0表示没有障碍,1表示有障碍,输入格式参考样例
 

Output

一个整数,即合法的方案数。

Sample Input

2
0 1
1 0

Sample Output

1
  这道题竟然考的是高精度,吓到我了……
  一开始没读到数据范围还以为是状压裸题,然后一看到N<=200,吓一跳,然后开始琢磨动归方程,于是乎,一开始就错了的我走上了一条不归路。
  最后实在没辙,看了一眼题解,好吧,我输了。
  这道题我们可以分析为错排问题:一共 1~n n个数,对于任意数x都不在第x个位置上有多少方案数。
  为什么这么说呢?我们可以注意到,既然每一行每一列有且只有一个障碍,那么,每一行障碍的位置对于答案没有任何实际影响,如果我们按照每一行障碍的位置对行进行排序的话就转化成了第i行的棋子不能出现在第i个位置的问题,也就是我们上面说的错排问题了。
  那么错排问题的公式是什么呢?
    f[i]=f[i-1]*(i-1)+f[i-2]*(i-1)
    原理:

      第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
      第二步,放编号为k的元素,这时有两种情况:⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有f(n-2)种方法;⑵第k    个元素不把它放到位置n,这时,对于这n-1个元素,有f(n-1)种方法。(摘自百度百科)
  还是挺好玩的。
  然后,就是传统的高精度了呗。

 #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#define N 10000
using namespace std;
int n,p=;
struct no
{
int a[N],l;
}f[],c;
no get(int x)
{
no aa;
aa.l=;
aa.a[]=x;
return aa;
}
no jia(no a,no b)
{
memset(c.a,,sizeof(c.a));c.l=;
for(int i=;i<=max(a.l,b.l)+;i++)
{
c.a[i]+=a.a[i]+b.a[i];
c.a[i+]+=c.a[i]/p;
c.a[i]%=p;
}
for(int i=max(a.l,b.l)+;;i--)
{
if(c.a[i])
{
c.l=i;
break;
}
}
return c;
}
no cheng(no a,no b)
{
memset(c.a,,sizeof(c.a));c.l=;
for(int i=;i<=a.l;i++)
{
for(int j=,to=i;j<=b.l;j++,to++)
{
c.a[to]+=a.a[i]*b.a[j];
c.a[to+]+=c.a[to]/p;
c.a[to]%=p;
}
}
for(int i=a.l+b.l+;;i--)
{
if(c.a[i])
{
c.l=i;
break;
}
}
return c;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
int x;
scanf("%d",&x);
}
}
f[].a[]=,f[].l=;
f[].a[]=,f[].l=;
for(int i=;i<=n;i++)
{
f[i]=cheng(get(i-),jia(f[i-],f[i-]));
}
printf("%d",f[n].a[f[n].l]);
for(int i=f[n].l-;i>=;i--)
{
printf("%04d",f[n].a[i]);
}
return ;
}

[Haoi2016]放棋子 题解的更多相关文章

  1. BZOJ4563:[HAOI2016]放棋子——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4563 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列 ...

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

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

  3. 洛谷P3182 [HAOI2016]放棋子

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

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

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

  5. BZOJ4563: [Haoi2016]放棋子

    Description 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在 这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子也满足每行 ...

  6. [HAOI2016] 放棋子及错排问题

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

  7. BZOJ 4563: [Haoi2016]放棋子

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 389  Solved: 248[Submit][Status][Discuss] Descriptio ...

  8. BZOJ——T 4563: [Haoi2016]放棋子

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 387  Solved: 247[Submit][Status][Discuss] Descriptio ...

  9. 洛谷 P3182 [HAOI2016]放棋子(错排问题)

    题面 luogu 题解 裸的错排问题 错排问题 百度百科:\(n\)个有序的元素应有\(n!\)个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排:有的叫重排.如,1 2的错 ...

随机推荐

  1. delphi资源文件的使用

    delphi资源文件的使用 资源文件(*.res)通过编译指令 $R 关联, 譬如工程文件 Project1 中的 {$R *.res} 就是关联 Project1.res 资源文件, 我们直接写作 ...

  2. Win8Metro(C#)数字图像处理--2.25二值图像距离变换

    原文:Win8Metro(C#)数字图像处理--2.25二值图像距离变换  [函数名称] 二值图像距离变换函数DistanceTransformProcess(WriteableBitmap sr ...

  3. Android零基础入门第45节:GridView简单使用

    原文:Android零基础入门第45节:GridView简单使用 前面一共用了8期来学习ListView列表的相关操作,其实学习的ListView的知识完全适用于AdapterView的其他子类,如G ...

  4. delphi Stomp客户端连接 RabbitMQ(1)

    最近公司想上个消息推送系统,网上搜了很多,因公司主要产品是Delphi,我选择了开源的RabbitMQ,Erlang语言开发,天生并行. 代码下载地址:delphistomp下载地址 windows上 ...

  5. springboot 2.x处理404、500等异常

    404错误 404错误是不经过Controller的,所以使用@ControllerAdvice或@RestControllerAdvice无法获取到404错误 springboot2处理404错误的 ...

  6. SharePoint js操作原生的New/Edit表单

    列表的表单,有个类似的需求:在New需隐藏特定字段,Edit时显示. 默认是New/Edit表单的字段是一样,就算在Content type 是隐藏也是同时影响两个表单.   如何做到仅仅在New时隐 ...

  7. 无辜的RAD(RAD是让你去创造和使用可复用的组件,不是让程序员“变白痴”)good

    无辜的RAD 2005-3-21 说实话,RAD很无辜.从出生的那天其就被骂,天天被指着鼻子说“不就是拖个控件嘛”,就好像当年说学电脑“不就是插个鼠标嘛”.也怪程序员大都天性犯贱,就爱一遍又一便的写基 ...

  8. Tuxera NTFS 2018 for Mac中文破解版 U盘读写软件-让你的Mac支持NTFS

    下载链接(复制到浏览器下载):http://h5ip.cn/TLMc 软件介绍 给大家带来一款苹果Mac上如何使用U盘读写的软件,Tuxera NTFS 2018 for Mac中文破解版,Mac O ...

  9. 一次项目代码重构-使用spring容器干掉条件判断

    一次项目代码重构-使用spring容器干掉条件判断 这是在一次公司项目中进行重构时,一些复杂业务时想到的一个去掉一些if else的办法.能够使代码逻辑更加清晰,减少一些业务上的耦合. 业务说明 我所 ...

  10. gitlab安装笔记一_虚拟机中安装Centos7

    (为搭建gitlab环境的准备) 环境:vmware workstation 12 pro 系统: CentOS-7-x86_64-Everything-1804.iso  (CentOS-7-Min ...