A. Mike and Frog
枚举。
先是找循环,然后很容易得出一个两元一次方程,然后可以发现解也是有循环节的,所以最小的那个肯定出现在一定范围内,否则就后面也不可能出现。假设两个变量为x,y,系数分别为z1,z2。很显然,两者的最小公倍数便是一个周期,所以如果枚举x的话,只需要枚举到z2就可以了。
细节比较多。。错了好多次。。比赛中也跪了。。
代码如下:
#include
#include
#include
#include
#include
#include
#include
B. Mike and Feet
单调栈(或者线段树)
这题的大体思路很容易,就是找出每个数作为最小值的向左向右延伸的最大范围,那么这个范围之内的都有可能会以这个最小值作为最大值,于是用标记法标记前缀的最大值就可以了。
然后就是找延伸的范围了。弱只想到了万能的离散化+线段树的思路。也不算很麻烦,但是复杂度略高。还有一个更简单的方法是单调栈的思路。不止复杂度低,只有O(n),代码复杂度也低。用单调栈来保证栈内始终是递增的,所以栈底就是延伸的最大范围。在这里只贴个线段树的思路的,也是弱比赛的时候写的。
话说比赛的时候因为定义了两个n。。调试了将近一个小时。。。时间全浪费在这上面了。。。。
代码如下:
#include
#include
#include
#include
#include
#include
#include
C. Mike and Foam
状压+容斥
这题只要想清楚一点就很简单了。。。就是5*10^5范围内的任意一个数的质因子的个数都不会超过6个。。只要想到了这点,就很简单了,状压一下再容斥一下乱搞搞就解决了。
代码如下:
#include
#include
#include
#include
#include
#include
#include