NOI2011 Day1
兔农
题目描述:(fib[1]=fib[2]=1, fib[i]=fib[i-2]+fib[i-1] (igeq 3)),若(fib[i] equiv 1(mod k)(i geq 3)),则(fib[i]=fib[i]-1),已知(k, P),求(fib[n] mod P)
solution:
先看一下当(k=7)时,(fib[i] mod k):(每行的最后一个数变为0)
1, 1, 2, 3, 5, 1
5, 5, 3, 1
3, 3, 6, 2, 1
2, 2, 4, 6, 3, 2, 5, 0, 5, 5, 3, 1
3, 3, 6, 2, 1
……
出现循环了,也就是说这是有循环节的,而且每一行都是一个斐波那契数列,由于每行的最后一个数为(0),下一行的第一个数变成了该行的倒数第二个数,下一行的第二个数与第一个数相同,构成新的斐波那契数列的首两项。
设每行首项为(X),每一项除以(X),就是原来的斐波那契数列。
令(X*fib[i] equiv 1 (mod k))成立的最小的(i)记为(Len[X]),这就是以(X)为首项的长度,如果(Len[x])不存在,则说明以后都不会再减一,之后就按照斐波那契数列去做就好了。
求(Len[X]),就要求(X)的逆元,因为(k)不一定是质数,只好用扩展欧几里得求出(fib[Len[X]]),从而求出(Len[x])。
计算斐波那契数列时用到矩阵乘法,自己构造一下就好了。
这题的可行性在于一个结论:模(k)意义下的斐波那契数列的循环节(leq 6k)
时间复杂度:(O(6k))
智能车比赛
题目描述:给出(n)个矩形,第(i)个矩形区域的左下角和右上角坐标分别为((x_{i,1},y_{i,1}))和((x_{i,2},y_{i,2})), 保证(x_{i,1}<x_{i,2}=x_{i+1,1},y_{i,1}<y_{i,2}),给出起点坐标与终点坐标,只能在矩形内行走,问起点到终点的最短路径。
solution:
只有相邻两个矩形的重边的端点是有用的,然后(n^2)连边,最短路。
时间复杂度:因算法而异
阿狸的打字机
题目描述:给出一串操作,包含小写字母或('B','P'),小写字母表示在字符串末尾添加该字母(字符串一开始为空),('B')为删去最后一个字母,('P')为输出当前字符串。有若干个询问((x, y)),问第(y)个输出的字符串包含多少个第(x)个输出的字符串。
solution:
容易想到AC自动机+fail-tree,然后把询问离线读入,按(y)从小到大排序。在fail-tree中,任意一个点的子树的字符串都包含该点所对应的字符串。
按照操作顺序模拟,将(y)到根的点(+1)(AC自动机),查找(x)的子树的和(fail-tree)即为答案。
时间复杂度:(O(nlogn))