NOIP2009提高组复赛原题题解——Proking

来源:互联网 发布:空间句法软件 编辑:程序博客网 时间:2024/06/06 05:42

要开始准备GDKOI了,这应该是第一场正式赛吧,今天是在家里做的,状态不好,做题没有紧迫感,T2竟然考试时没有A掉,T4也没有多想想,T3更是一道很水的spfa(关键是得动动脑子啊!感觉自己智商有问题)下面是题解:


T1:太水了,看看‘-1’什么之类的别被坑就好


T2:

题目大意:

·给你四个数,a0,a1,b0,b1,让你求出所有满足条件的x使得gcd(x,a0)=a1,lcm(x,b0)=b1

·这道题的解法肯定不止一种;

下面先讲个人方法:

·通过样例手算一下可以看出,我们不凡先求出所有满足第二个条件的x,再去判断第一个条件是否满足。

·显然,先要把b0与b1分解质因数,然后再看看是否有规律可寻:

·b0=96=2^5*3

·b1=288=2^5*3^2

·我们看看x可能可以取些什么值?

·①可以看出所取的x当中包含的因子只得是b1当中的因子

·②还需明白一基本性质,gcd(a,b)*lcm(a,b)=a*b

·根据性质②,可以推断出x可以有一个2,两个2,直至5个2,3却一定得有2个

·不凡继续假设下去,可发现x因数规律如下:

·③当b0与b1当中共有某一因子时,设b0拥有的因子个数为t0,b1则为t1,分类讨论:

当t0<t1时,显然x需要取t1个共有因子

当t0=t1时,可以取0~t1个共有因子(递归枚举)

当t0<t1时,可证b0与b1在b1范围内无公倍数

·通过上述讨论,x的因子怎么求就很显然了,但还需注意的是,如果b0有的因子而b1没有的话,也可证在b1范围内两数无公倍数;分解质因数需要预处理


第二种方法:

·上面方法的思路清晰,但实现起来还是有点麻烦,我们可以考虑通过数学角度考虑:

·因为gcd(x,a0)=a1,所以gcd(x/a1,a0/a1)=1   ......①

·因为gcd(x,b0)=x*b0 div b1,所以gcd(b1/b0,b1/x)=1   ......②

·通过①和②可以想到枚举x,然后判断式子,并加剪枝:在判断x时直接判断b1 div x,使得效率变为O(n*sqrt(b1))

·但这样子还是会卡一个点,我们继续优化

·可以枚举b1/x的值,使得效率变为O(n*sqrt(b0))

·易证对于任意一个满足条件的x,b1/x一定小于等于b0


T3:

·可把题目转化:从原点到某一城市当中的路径中取一最小值再由这个点到达终点的路径中取一最大值。

·显然取一最小值可以从原点spfa一遍,那么取最大值的时候需要注意,我们是以终点为源点往一个点进发,但实际上的题目转化是从一个点到终点,所以需要第二遍spfa的时候把边反向。


T4:

·题目大意很容易理解,就是数独

·纯粹暴力可以水个80分,注意是边填边判断

以下是我个人方法:

·那么考虑优化

·其实我们可以从每次可能出错概率最低的点开始dfs,也就是这个点的行列当中所已经填的数是最多的,那么我们就从这个点开始dfs,然后就把其所在行列当中每个数的“所填数”的数量+1,并在这些点当中寻找一个最大的值继续dfs

·上述方法可以在很快时间内完成填空

·可以减少很多时间复杂度

·这题有其实还可以用无脑剪枝卡过去,但这样子并没用,假想在考试中如果自作聪明地把递归顺序改变后出了考场少了三十分,那尴尬,还是算了……





总结:从下次比赛开始,约定,每一道题一定不问别人超过两次,尽量不问超过一次,最好不问,遇到超出能力一些题目,如一类数论问题,动态规划等可以试着循序渐进,让他人讲的稍微详细一点(如不会推DP方程),代码实现一定得全程自己完成。其实,做题最重要的真的是过程,做得越久收获越大,所以,以后改题千万不要在自己还没有完全弄懂时就去打了,得闭着眼睛都能想出来并打出来后之后再去打,更不要为了一时的排名分数而心浮气躁,总想快点把题改完,往往这样子会浪费了很多好题。

不浪费好题,从现在做起。

0 0
原创粉丝点击