T1
Description
求包含了第k项的最长上升子序列
Hint
模板题,因为一定要包含第k项,我们考虑去掉第k项前所有大于它的数,后面所有小于它的数,然后O(nlogn)分别求前后,最后相加即可
Code
模板题不给代码好了
T2
Description
给定n求 1n!=1x+1y 的正整数解的组数
Hint
我们分析可知x和y会大于n!(不然
1x+1y会大于1n!
),我们设x=n!+k,带入原等式化简可得
y=(n!)2k+n!
,因为y和x一定要是正整数所以解的组数就是
(n!)2
的因子数
我们考虑求出
[1,n]
所有数分解质因子,也就是说:
n!=(2)∗(3)∗(2∗2)∗(5)∗(2∗3)∗(7)∗(2∗2∗2)......
我们发现有很多一样的因子,所以n!其实可以写成:
n!=2e1+3e2+5e3+7e4+......
所以
(n!)2=22e1+32e2+52e3+72e4+......
所以总因子数
=(2e1+1)(2e2+1)....(2ek+1)
(考虑第x个因子取[0,e_x]个)
所以我们把 [1,n] 质因数分解先存下来,最后算就好了
数据大的时候需要先筛素数,还可能要高精度
Code
//待补充
T3
Description
给你一个字符串a,你每次可以指定一对a[i]与a[i+1]交换,求最少交换次数让它变成回文串
Hint
逆序对基本套路 当一道题大致表示 “把给定数组用最小步数变成目标数组”的时候,可以考虑逆序对(目标数组和给定数组的元素要想同且不重复)
基本步骤 比如我们要用最小代价把 “1 4 2 3”变成 “1 2 4 3”,我们把给定数组视为 “1 2 3 4”,即把1视为1,4视为2,2视为3,3视为2.则给定数组变为 “1 2 3 4”而目标数组变为 “1 3 2 4”,然后你就只要求目标数组的逆序对数量就好了
本题也满足基本套路
我们考虑贪心,发现不改变
Code
//待补充