[CSP-S模拟测试]:棋盘(数学+高精度)

题目描述

在一个大小为$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++

原文地址:https://www.cnblogs.com/wzc521/p/11649721.html

时间: 2024-10-08 02:47:55

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

模拟测试(vj)

做这份模拟测试,已经崩溃了,英文看不懂,题意理解错.到结束了只a了第一题,人生陷入了低谷,于是花了一天的时间终于把不会的弄明白了,在这里写一份总结~ T1,简单的模拟,如果打枪打中一支鸟,将这个位置设为0,并向两边扩散,注意这个位置一定要有鸟. 代码~ #include<bits/stdc++.h> using namespace std; int a[30000]; int n,m; int main() { cin>>n; for(int i=1;i<=n;i++) ci

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

测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabricator differential 发diff时提交需要执行的单元测试,在开发流程上就可以保证远端代码的稳定性). 2. 测什么? 一般单元测试: 列出想要测试覆盖的异常情况,进行验证. 性能测试. 模拟测试: 根据需求,测试用户真正在使用过程中,界面的反馈与显示以及一些依赖系统架构的组件的应用测

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

css Hack,用IE11模拟测试的,条件注释要找真IE去测,模拟的无效

<!DOCTYPE html> <!--[if lt IE 7 ]> <html class="ie6 ie"> <![endif]--> <!--[if IE 7 ]> <html class="ie7 ie"> <![endif]--> <!--[if IE 8 ]> <html class="ie8 ie"> <![endif]

2016年上半年软考真题在线模拟测试,提前知晓你的成绩

2016年上半年软考于5月21日结束了,考试完想知道结果的急切心理,几乎每个经历过上学时代的人都能深刻体验到.如果你想知道你考的怎么样,如果你想要提前知道你的成绩,如果你想知道你哪个地方出错了,如果你想知道你哪个地方知识掌握的不够想要更深入的去理解,那就来希赛软考学院吧!希赛软考学院提供2016年上半年软考真题在线模拟测试,有标准的参考答案,有专业老师的解析视频,让你提前知晓你的成绩,让你再次巩固学习. 希赛授课专家介绍 张友生,计算机应用技术博士,软考培训教程系列丛书主编,考试指定教材<系统分

Mock 模拟测试简介及 Mockito 使用入门

Mock 是什么 mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代替品. 简单的看一张图 我们在测试类 A 时,类 A 需要调用类 B 和类 C,而类 B 和类 C 又需要调用其他类如 D.E.F 等,假如类 D.E.F 构造很耗时又或者调用很耗时的话是非常不便于测试的(比如是 DAO 类,每次访问数据库都很耗时).所以我们引入 Mock 对象. 如上图,我们将

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

题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1803 题目大意: 给定n,m(n,m<=109)1<=i<=n,1<=j<=m,求i*j%2016=0的方案数. 题目思路: [模拟][数学] 按照%2016的余数分类.每增加一个2016就又多一种方案.统计是2016的几倍,根据余数分类.最后枚举i,j的余数即可求解. 1 // 2 //by coolxxx 3 //#include<bits/stdc++

asp.net中模拟测试smtp发邮件

最近在编程人生里要测试一个会员邮件的功能,就写了下面的代码. 在asp.net 中,有时要测试发信SMTP,但如果在单元测试中,如果没方便好用的 smtp怎么办,其实还是有办法模拟的,下面讲解下: 在web.config 中设置 <system.net>   <mailSettings>      <smtp deliveryMethod="SpecifiedPickupDirectory">          <specifiedPickup

2018冬令营模拟测试赛(三)

2018冬令营模拟测试赛(三) [Problem A]摧毁图状树 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 这题没想到贪心 QwQ,那就没戏了-- 贪心就是每次选择一个最深的且没有被覆盖的点向上覆盖 \(k\) 层,因为这个"最深的没有被覆盖的点"不可能再有其它点引出的链覆盖它了,而它又