题目背景
小 W 喜欢读书,尤其喜欢读《约翰克里斯朵夫》。
题目描述
最近小 W 准备读一本新书,这本书一共有 pp 页,页码范围为 0 \sim p-10∼p−1。
小 W 很忙,所以每天只能读一页书。为了使事情有趣一些,他打算使用 NOI2012 上学习的线性同余法生成一个序列,来决定每天具体读哪一页。
我们用 x_ixi 来表示通过这种方法生成出来的第 ii 个数,也即小 W 第 ii 天会读哪一页。这个方法需要设置 33 个参数 a,b,x_1a,b,x1,满足 0\leq a,b,x_1\lt p0≤a,b,x1<p,且 a,b,x_1a,b,x1 都是整数。按照下面的公式生成出来一系列的整数:
x_{i+1} \equiv a \times x_i+b \pmod pxi+1≡a×xi+b(modp)
其中 \bmodmod 表示取余操作。
但是这种方法可能导致某两天读的页码一样。
小 W 要读这本书的第 tt 页,所以他想知道最早在哪一天能读到第 tt 页,或者指出他永远不会读到第 tt 页。
输入格式
本题单测试点内有多组测试数据。
第一行是一个整数 TT,表示测试数据组数。
接下来 TT 行,每行有五个整数 p, a, b, x_1, tp,a,b,x1,t,表示一组数据。
输出格式
对于每组数据,输出一行一个整数表示他最早读到第 tt 页是哪一天。如果他永远不会读到第 tt 页,输出-1−1。
来理解别人的代码:
BSGS算法(大小步算法)主要解决A^x=B(mod C)已知ABC求x的值。
该题目将公式进行转变一下得到An的通项,因为题目中直接给了P为质数,所以直接就可以套用到BSGS算法。
*map<key,value>容器。map中的关键字只能出现一次,关键字不能修改,但值可以修改。
因为P为质数,根据费马小定理,A^p-1=1(mod)p。又知道a^0=1(mod p),所以幂的长度不超过p的循环。
代码的步骤先是第一个得到幂的函数,第二个是BSGS(先是求m的数值,再求b mod p的值,开始枚举前一半的结果,将其放到map中,再求得幂值,如果幂为0,则判断b是否为0,为0返回1,不为0返回-1。再进行后半部分的枚举,判断map中是否有相等的值,找到第一个相等的值就可以得出对应的im-j是最小的x。主函数就是对一些特殊情况的特判之后,再进行数值对应公式调整后,开始进行直接运用BSGS函数)
题目背景
小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。
有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。
题目描述
给你云朵的个数 NN,再给你 MM 个关系,表示哪些云朵可以连在一起。
现在小杉要把所有云朵连成 KK 个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。
输入格式
第一行有三个数 N,M,KN,M,K。
接下来 MM 行每行三个数 X,Y,LX,Y,L,表示XX云和 YY 云可以通过 LL 的代价连在一起。
输出格式
对每组数据输出一行,仅有一个整数,表示最小的代价。
如果怎么连都连不出 KK 个棉花糖,请输出 No Answer
。
这里运用到Kruscal算法。
首先是创建一个无向图,然后将无向图里面的权值大小进行从小到大的排序,开始进行权值的遍历,进行判断,是否与相连形成一个环,如果没有形成一个环,那么将权值进行相加,如果形成环那么跳过该值进行下一个判断,最后得到的就是最小生成树。
代码中关键是实现判断是否成环,是首先定义一个数组,来存放祖先,然后,将其初始化为数组下标本身,再判断路径是否相同,路劲不相同就是没有形成环。