题目描述

在一个大小为$N\times N$的棋盘上,放置了$N$个黑色的棋子。并且,对于棋盘的每一行和每一列,有且只有一个棋子。
现在,你的任务是再往棋盘上放置$N$个白色的棋子。显然,白色棋子不能与黑色棋子重合。在此基础上,放置的方式还需要满足:对于棋盘的每一行和每一列,有且只有一个白色棋子。
当然,放置的方式有很多种,你只需要输出不同的放置方案数即可。


输入格式

输入文件为$board.in$。
第一行包含一个正整数$N$。
接下来$N$行,每行$N$个整数用于描述棋盘。$0$表示这个位置是空的,而$1$表示这个位置有一个黑棋子。


输出格式

输出文件为$board.out$。
一行一个整数,表示合法的放置方案数。


样例

样例输入:

2
0 1
1 0

样例输出:

1


数据范围与提示

对于$20\%$的数据,满足$N\leqslant 10$。
对于$60\%$的数据,满足$N\leqslant 20$。
对于$100\%$的数据,满足$1\leqslant N\leqslant 200$。


题解

对于每一列,哪一行放黑子无所谓,那个就是逗你开心的。

先说一下我在考场上的思路,我想到了容斥和组合数。

首先,如果不考虑黑子,那么我们有$N!$种放法。

然后我们可以考虑有黑子的情况,设$f[i]$表示至少有$i$列合法的方案数,此处的合法是指白子和黑子没有放到一起,则:

$$f[i]=(N-i)!\times C_N^i$$

先来解释式子,$(N-i)!$表示剩下的我们还是可以随便选,$C_N^i$则表示在$N$列中选出$i$列。

最后答案就是$\sum \limits_{i=1}^N (-1)^i f[i]$。

然而这个式子太麻烦了,于是$170$行各种高精多和一就爆炸了……

下面来讲官方题解,问题就是让求$N$个数的错排方案数,那么直接用递推式即可:

$$ans_n=(ans_{n-1}+ans_{n-2})\times (n-1)$$

时间复杂度:$\Theta(n^2)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n;
long long f[201][1000],flag1,flag2;
void pls(int x)
{
int jw=0;
f[x][0]=f[x-1][0];
for(int i=1;i<=f[x][0];i++)
{
f[x][i]=f[x-1][i]+f[x-2][i]+jw;
jw=f[x][i]/10;
f[x][i]%=10;
}
for(int i=f[x][0]+1;i;i++)
{
if(!jw)break;
f[x][i]+=jw;
jw=f[x][i]/10;
f[x][i]%=10;
f[x][0]=i;
}
}
void che(int x)
{
flag2=0;
for(int i=1;i<=f[x][0];i++)
{
flag1=f[x][i]*(x-1)+flag2;
f[x][i]=flag1%10;
flag2=flag1/10;
}
if(flag2)f[x][++f[x][0]]=flag2;
}
int main()
{
scanf("%d",&n);
f[1][1]=0;
f[2][1]=1;
f[2][0]=1;
for(int i=3;i<=n;i++)
{
pls(i);
che(i);
}
cout<<f[n][f[n][0]];
while(--f[n][0])
{
cout.fill('0');
cout<<setw(1)<<f[n][f[n][0]];
}
return 0;
}

rp++

[CSP-S模拟测试]:棋盘(数学+高精度)的更多相关文章

  1. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

  2. 0823NOIP模拟测试赛后总结

    考了两场感觉虚了... NOIP模拟测试30 分着考的. 就只有T2的美妙的暴力拿分了,60分rank10,挂了. T1是一道sb题,爆零了十分遗憾. 许多人都掉进了输出格式的坑里,C没大写.少个空格 ...

  3. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  4. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  5. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  6. 【模拟】【数学】CSU 1803 2016 (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1803 题目大意: 给定n,m(n,m<=109)1<=i<=n,1& ...

  7. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  8. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  9. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

随机推荐

  1. X509格式的证书校验(基于GMSSL2019-06-15版本)

    实现X509格式证书的链式校验 // cert_public.cpp : Defines the exported functions for the DLL application. // #inc ...

  2. .net任务调度平台 Dyd.BaseService.TaskManager

    国外网速慢,最新版本迁移至http://git.oschina.net/chejiangyi/Dyd.BaseService.TaskManager .net 简单任务调度平台 用于.net dll, ...

  3. 疯狂Java学习

    面向对象(下) 6.3:类成员:又讲了一遍static修饰的类成员:   Singleten(单例)类: 通过封装的方式,实现了一个类只能创建一次,应该是为了更好编写代码,创造的一个概念. 6.4:f ...

  4. 剑指offer--day07

    1.1 题目:反转链表:输入一个链表,反转链表后,输出新链表的表头. 1.2 思路:这道题,我们要做到的是反转链表,我们的思路是将前一个节点与后一个节点断开,然后让后一个节点指向前一个节点,这个过程就 ...

  5. vue 中注册全局组件

    1  全局注册组件 建一个 js 文件, 注册全局组件, 并且暴露出去 然后再在 main.js  中引入       在页面就可以直接使用了    2 全局注册过滤器 建立文件, 包含所有过滤器方法 ...

  6. CEPH安装(CentOS 7)

    以包含四个节点的集群为例,其中包括一个 ceph-deploy 管理节点和一个三节点的Ceph存储集群. 下图中每个节点代表一台机器. 安装 CEPH 部署工具 执行如下命令: sudo yum in ...

  7. [Web 前端] 019 css 定位之绝对定位与相对定位

    1. 关于定位 我们可以使用 css 的 position 属性来设置元素的定位类型 postion 的设置项如下 设置项 释义 relative 生成相对定位元素元素所占据的文档流的位置不变元素本身 ...

  8. [Python3] 007 列表的遍历,你是 for 联盟还是 while 部落

    目录 少废话,直接上例子 for 联盟 for 与 list 的简单合作 for 的老搭档 range() for 与嵌套列表(双层列表) for 从 if 那儿认识的 else 循环"三杰 ...

  9. 移动端的设备提供了一个事件:orientationChange事件

    移动端的设备提供了一个事件:orientationChange事件:https://blog.csdn.net/gong1422425666/article/details/79001836

  10. 关于Python程序的运行方面,有什么手段能提升性能?

    1.使用多进程,充分利用机器的多核性能 2.对于性能影响较大的部分代码,可以使用C或C++编写 3.对于IO阻塞造成的性能影响,可以使用IO多路复用来解决 4.尽量使用Python的内建函数 5.尽量 ...