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次即为不合法方案的答案了。

0 0