2016.09.10【初中部 NOIP提高组 】模拟赛C
来源:互联网 发布:adobe system四大软件 编辑:程序博客网 时间:2024/05/17 03:24
T1:题目大意:给你n个1,m个0组成的序列,如何排列n+m位之间1,0的顺序,使得到任意位时1的个数一定比0的个数多,求出所拥有的方案数。
这道题一开始理解题意花了一个钟,一开始打了dp,打了递归,打了...于是到9:00才真正理解了题意。
如果不易理解题意的话,可以看如下一个图:
在这个平面坐标系上从0,0开始走到n,m,走道的路径中任意位置(x,y)不能走到x>y的地方即可计入答案。
对于总共有n+m个数字组成的序列,那么一定要选m个数。则方案数为C(n+m,n).
而不符合题目要求的序列则是C(n+m,n+1).
至于为什么,这里简单证明.
对于一个符合题目要求的序列,一定有且仅有一个对应的i表示到这个序列的第i位时1的个数比0的个数多1(除相等外).
那么对于这个符合的序列,把所有数字取反,则变成了一个不符合要求的序列.
这个不符合要求的序列很明显方案数就是C(n+m,n+1).
其余一些1的个数比0个数大于1的情况,也一定在C(n+m,n+1)的范围内。
那么对于答案就是
=C(n+m,n)-C(n+m,n+1)
=[(n+m)!/n!*m!] - [(n+m)!/(n+1)!*(m-1)!]
=[n+m!*(n+1)/(n+1)!*m!] - [(n+m!)*m/(n+1)!*m!]
=((n+m)!*(n+1)-(n+m)!*m)/((n+1)!*m!)
=((n+m)!*(n+1-m))/((n+1)!*m!)
=(n+m)!/((n+1)!*m!)*(n-m+1)
=((n+2)*(n+3)*(n+4)*……*(n+m))/(m!)*(n-m+1)
则可以直接对这个最候化简的算式做一遍高精度乘法,在除一遍低精度,最后乘一个(n-m+1)即可。
当然,如果纯粹这么做的话需要大概700ms,则我们可以做乘法时直接做除法,除法从1除起,则一直乘除时一定不会出现不能整除的情况。这样子做后大概只用不到0.2s即可绿了。
现在,对于低精度除法写一番论述。
对于被除数a数组,除数x
则过程如下:
procedure division(x:longint);beginr:=0;for i:=len downto 1 do//对于a数组的长度lenbegind:=(a[i]+r) mod x;//上次剩余+本次拥有 再除以 x 的余数即为本次余数。a[i]:=(a[i]+r) div x;//上次剩余+本次拥有 再除以 x 的数为本次除得的数。r:=d*10000;//本次剩余等于本次余数乘以10000 因为是压4位储存的。end;while (a[len]=0) and (len>1) do dec(len);end;
T2:题目大意:给你一个正整数N,求一个最小的正整数m,使得n*m所表示的十进制数中的每一位都是由‘0’和‘1’构成的。
分析:
很明显,可以bfs找个“构成”的数,然后做一遍题目要求的条件看看是否符合。
但这样子,因为qword的范围,只能做到20位,对于20位以后的数就难求了。
所以,如果,如果你想求的话,可以把这个“构成”的数看成一个二进制数,然后枚举这个二进制数对应的十进制数,这样子的话就可以做到63位了。
虽然事实证明,虽然可以求这么多位,但是事实上是求不了的,炸时间啊。。。
但,毕竟这道题除了这两种解法好像没有别的什么解法了吧。。。
T3:题目大意:在一个n*n的矩阵当中,有m个地方是不能放雕像的,然后,让你放n个雕像,使得这n个雕像只在能放置的地方放,且一行一列只能有一个雕像,问你总共有多少种方案?
因为M比较小,所以转化思路,改成用——所有方案数-不合法方案数=合法方案数。
那么不合法方案数怎么算呢?
假设有一个雕塑放在了不能放置的地方,(有r[1]种)则其余可能的N-1个雕像任意放位置,则有r[1]*(n-1)!种不合法方案。
但在这不合法的方案中却有减多的,例如我放在第一个不能放的位置,有(n-1)!种不能放的,然后放第二个不能放的位置,又有(n-1)!种,但在这(n-1)!种里一定有重复的,一定有同时放在两个雕像位置所重复的,所以我们要加上一个r[2]*(n-2)!,但是加上这个数后很明显又有加多的,所以要再减r[3]*(n-3),然后又会减多,再加上去,以此类推,加减m次即为不合法方案的答案了。
- 2016.09.10【初中部 NOIP提高组 】模拟赛C题解
- 2016.09.10【初中部 NOIP提高组 】模拟赛C
- 2016.09.10【初中部 NOIP提高组 】模拟赛C
- 2016.09.10【初中部 NOIP提高组 】模拟赛C
- 2016.09.10【初中部 NOIP提高组 】模拟赛C题解
- 2016.09.10【初中部 NOIP提高组 】模拟赛C 总结
- 2016.09.10【初中部 NOIP提高组 】模拟赛C题解
- 2016.09.03【初中部 NOIP提高组 】模拟赛C题解
- 2016.09.03【初中部 NOIP提高组 】模拟赛C
- 2016.09.03【初中部 NOIP提高组 】模拟赛C
- 2016.09.03【初中部 NOIP提高组 】模拟赛C题解
- 2016.09.03【初中部 NOIP提高组 】模拟赛C题目
- 2016.09.03【初中部 NOIP提高组 】模拟赛C题解
- 2016.09.17【初中部 NOIP提高组 】模拟赛C
- 2016.09.17【初中部 NOIP提高组 】模拟赛C题解
- 2016.09.15【初中部 NOIP提高组 】模拟赛C题解
- 2016.09.17【初中部 NOIP提高组 】模拟赛C
- 2016.09.24【初中部 NOIP提高组 】模拟赛C
- MySQL的基本操作指令
- 3.CALL与单步调试
- 1010. Radix (25)-PAT甲级真题(二分法)
- SpringMVC 防止表单重复提交
- Unix网络编程 卷1 第8章: 基本UDP套接字编程(概述及recvfrom/sendto函数)
- 2016.09.10【初中部 NOIP提高组 】模拟赛C
- Shell数组:shell数组的定义、数组长度
- range的使用
- MySQL数据类型
- Struts2_04_路径问题
- ucos学习2
- 基本类型与字符串之间的转换
- POJ 2385 Apple Catching
- hdu Sparse Graph(补集)