二模 (12) day1

第一题:

题目大意:

求由N个1,M个0组成的排列的个数,要求在排列的任意一个前缀中,1的个数不少于0的个数。N,M<=5000。

解题过程:

1.看到N,M的范围就明确肯定不会是dp,因为起码要用二维表示状态,就算转移是O(1),也要5000*5000的时间,况且还要高精度,绝对超时。

2.于是想到可以根据Catalan数的推导方法来推出公式。

ps:Catalan数的推导方法和一些应用可以参考我之前的博文中的问题二http://www.cnblogs.com/vb4896/p/3874622.html

下面把这题的公式简单地推一遍:

首先可以考虑所有的排列数减去不符合要求的排列数就是答案:ans=C(n+m,m) - 不符合要求的排列数。

对于任意一个不符合要求的数,必定在从某一奇数位(设为pp)上第一次出现0比1多的情况。

那么假设把第[pp+1,n+m]位上的所有0变成1,所有1变成0,那么就变成了一个有m-1个1,n+1个0的排列,也就是说任意一个不符合要求的排列都可以转换成有m-1个1,n+1个0的排列。 同理任意一个有m-1个1,n+1个0的排列也可以转换成一个不符合要求的排列。  所以不符合要求的排列数也就是有m-1个1,n+1个0的排列数。

所以ans=C(n+m,m) - C(n+m,m-1)  = { (m+n)! * (n-m+1) }/ {m! * (n+1)! }.

3.推出公式之后我就傻逼的去打 高精度乘高精度+高精度乘单精度了。结果发现后面的除法 是 高精度除 高精度。。还从来木有写过。 所以又想到可以把10000(n+m<=10000)以内的所有质数(p[i]表示第i个质数)搞出来,然后对于分子分母分解质因数,分别存到2个数组里(A[i] 存分子中有多少个质因子p[i],B[i]存 分子中有多少个质因子p[i]).

然后A[i]-B[i] 就是结果中 质因子p[i]的个数,做高精度乘单精度就可以了。 貌似也不需要压位,试验了下5000,5000的数据也能半秒之内出来。 8位一压就是0.01s秒杀了。。 折腾了将近一个半小时。



第二题:

题目大意:

给出一个正整数n(N≤100000),求一个最小的正整数m,使得n×m的十进制表现形式中只含1和0。

解题过程:

1.没什么思路,睡了个午觉后直接打了个暴力,dfs出18位以内的01序列(m*n),找到一个最小的能被n整除的就可以了。本来以为骗了50分不错了。结果数据比较良心,竟然给全过了。。但是不知道如何科学地判断无解的情况。

2.比较严谨的算法:也是搜索n*m,从1开始拓展,在数字后面要么加0,要么加1。只要保存当前数 mod n 的值mo即可, 如果在当前数的后面加一个0,那么新的数mod n 的值 就变成 mo*10 mod n 。加1也是同样的道理。 还需要做一个hash,因为如果当前数mod n = c , 之前已经搜索到一个数 mod n 也是 c , 显然前面那个数更优(按长度拓展,前面那个数长度短),那么就不要继续搜索下去了。 所以 搜索的状态最多只有n个,如果搜不到mod n=0的数就是无解。

3.搜索的时候保存的是该节点的父亲,以及从它的父亲拓展到它是加1还是加0,那么最后就可以递归来把这个数还原回去了。数据比较弱,不用写高精度,long long 就给过了。



第三题:

题目大意:

在N*N的棋盘上放N个车,规定有M个位置不能放,求使得车不能相互攻击的方案数。 N≤20,M≤10

解题过程:

1.这题感觉就是为了练习容斥原理设计的,之前在NOI导刊上看了篇容斥原理的文章,凭着仅有的一点点印象还是瞎搞出来了。

2.看到M的范围比较小,所以应该从M入手. 设M个不能放的位置分别为P1,P2,P3...PM.  反过来考虑,先求出所有的方案N!,然后减去不符合要求的。

3.设P1 必须放,那么就有(N-1)!种方案,设P必须放,那么有(N-1)!种方案,设P必须放,那么也有(N-1)!种方案。

把这些方案都减去,那么就重复减了P1 P2 都放了 , P1 P3 都放了...的情况,然后把这些情况加回去,又多加了P1 P2 P3 都放的情况.. 所有容斥原理的模型就出来了。。

ans=N! - P中有1个必须放的方案数 + P中有2个必须放的方案数 - P中有3个必须放的方案数 .....

+-交替即可。。  对于P中有k个必须放的方案数,只要dfs出P中选出不冲突的K个位置的方案数* (N-k)!  即可。

时间: 2024-10-23 03:59:53

二模 (12) day1的相关文章

二模 (16) day1&amp;day2

第一题:题目大意: 数列a[0]=a[1]=1, a[n]=a[n-2]*a[n-1]*n,求a[n]的因子个数 mod 1000000007.  n<=1000000 解题过程: 1.递推式还真没想出来,就记录每个a[i]的分解质因数的结果,然后转移质因子的个数.可以拿到30分. 2.思路:计算a[i]的时候,a[i]=a[i-2]*a[i-1]*i.  追踪这个i,它到a[i+1]里的时候是一个i,到a[i+2]里的时候是2个i,到a[i+3]里的时候是3个i,到a[i+4]里的时候是5个i

二模 (11) day1

第一题: 题目大意:用邻接矩阵给出一棵树(边权非负)上N个节点相互之间的最短路距离,求这棵树所有边权的和. 解题过程: 1.暂时还没想出来,待AC. 第二题: 题目大意:给出一些单词,然后建立Trie树,然后求出Trie树的节点个数. 解题过程: 1.这题学过Trie树的就直接无脑的建树就可以了.. 2.另外一种解法(待回校写出来验证):先添加一个空单词,然后给所有单词按字典序排序,从第二个单词(第一个是空)开始,看它和它前面的那个单词 的前面部分最多能有几个单词一样,也就是最长的公共前缀len

二模 (8) day2

第一题: 题目描述: 有 n 个炸弹,有些炸弹牵了一根单向引线(也就是说引线只有在这一端能被炸弹点燃),只要引爆了这个炸弹,用引线连接的下一个炸弹也会爆炸.每个炸弹还有个得分,当这个炸弹被引爆后就能得到相应得分.现在要你引爆 k 个炸弹,使得得分最大. 解题过程: 1.一开始想到算出每个入度为0的点打掉之后的得分,然后做个堆,从大到小打,但是路径会有重叠的情况,也就是说打掉一条路径后可能会导致另外一条路径的权值发生变化.. 2.然后听到YYL大神一直在说2次BFS,就想到可以倒着来做..从出度为

PMP备考资料 | 2019/2020年PMP全真模拟题 、一模、二模、三模试题 | PMP章节练习题 | 附带详细答案解析 --- 项目整合管理 等(PMBOK&#174;第六版)

PMP备考资料 | 2019/2020年PMP全真模拟题 .一模.二模.三模试题 | PMP章节练习题 | 附带详细答案解析 --- 项目整合管理 等(PMBOK®第六版),获取:http://t.cn/A6POWgMw 原文地址:https://www.cnblogs.com/chunlynn/p/12252179.html

二模 (12)day1

第一题: 题目大意: 有N颗糖,两个人轮流取,每次只能取质数颗,不能取的输.求先取者若必胜,最少需要多少步胜利.(N<=10000) 解题过程: 1.看到N的范围比较小,先打个素数表,然后dp即可. 2.F[i]表示i颗糖,先取的人若必胜,最少要多少步胜利,若必败,最多多少步失败.如果i减去一个质数可以达到一个必败态,那么必胜,反之必败. 初始得分80,数据坑爹,说小于10000的,却有20000的数据. 第二题: 题目大意: 有一种虫子,长度为X的时候,一天后会分裂成长度为X-1,X+1的2只

二模 (7) day1

第一题: 题目大意: 给出数轴上N棵树的坐标和高度,如果两棵树之间的距离小于其中一颗树的高度,那么就有树会被挡住.因此要把一些树砍矮一点.求砍树的总高度最小值. N<=100000; 解题过程: 1.水题,直接按坐标升序排个序,然后看某棵树左右的树会不会被挡住,砍掉相应的高度即可.. 特殊考虑最左边的树和最右边的树. 初始得分100. 第二题: 求从给定的n个数中取一些数(必须取),使得他们的乘积 mod p = c 的方案数.n≤32,p≤10^9,c≤10^9,a[i]<p,p 是质数 解

二模 (8) day1

第一题: 题目大意: 梦幻城市每年为全市高中生兴办一次运动会.为促使各校同学之间的交流,采用特别的分队方式:每一个学校的同学,必须被均匀分散到各队,使得每一队中该校的人数皆相同.为增加比赛的竞争性,希望分成越多队越好.你的任务是由各校的人数决定最多可以分成的队数. 解题过程: 1.直接求所有数的最大公约数即可. 初始得分100. 第二题: 题目大意: 给出一个式子火柴棍组成的A+B=C.(A,B,C<=999),求移动最少的火柴使得等式成立.不允许改变位数以及符号,不要制造0开头的数. 解题过程

二模 (3) day1

第一题: 题目描述: 一个数列定义如下:f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.给定 A,B 和 n 的值,要求计算 f(n)的值.(1≤ A, B ≤1000, 1 ≤n≤100,000,000). 解题过程: 1.方法一:矩阵乘法. 2.方法二:hash.如果 Ak,Ak+1  确定了,那么Ak+2 就确定了,而Ak,Ak+1 的值都是小于7的,所以做个二维hash,记录Ak,Ak+1  第一次出现的位置,就可

二模 (01) day1

第一题: 题目大意:给出N(N<=50)个小于1000的正整数Ai,和一个正整数max,和一个整数cur,从前往后依次对每个Ai,可以让cur+Ai 或者 cur-Ai,但是结果不能大于max,也不能小于0.求最终的cur的最大值. 解题过程: 1.一开始直接写了个爆搜+剪枝(ans=max或者ans+sum[i]<=ans),除了N=50的一些恶心数据都能过. 2.然后想到一个更强力的剪枝,就是当状态 (step,cur)之前已经搜索到过了,就跳过.然后就AC了. 3.其实第2条中的实质就是