Description
一个长为的序列,每个元素都在之间。
现在小C想在序列后面再加上个之内的元素,使得本质不同的子序列个数尽量多。
两个子序列被认为是不同的,当且仅当它们长度不同,或者至少一个对应位置的值不同。
输出最大的不同子序列个数,对取模。注意空序列不被看作一个子序列。
Constraints
Solution
先考虑怎么算不同子序列个数
设表示以这个数字结尾的子序列个数,那么显然
容易发现,无论接下来的元素是什么,其他的都是没有变化的
所以我们贪心地填当前的值最小的那个元素,也就是最后出现位置最靠前的那个元素
直接填是的,不难发现我们填的一定是一个的排列重复若干次,所以每个元素的转移都是相同的
因此我们可以矩阵快速幂优化
设为以第个位置结尾的答案,显然那么我们就是要构造一个矩阵,使得
那么显然
然后就可以直接矩阵快速幂了
Code
1 |
|
Debug
165行,加mod模mod