啦啦啦,今天的考试题
不过原来考试题的n<=10w
由于我有更好的做法,所以我就改成20亿辣
本来先说一说考试题的正解做法的
但是复杂度是O(nlogm),实在是太渣了
所以还是说一说我的做法吧
首先假定都会写裸的DP
我们考虑A,B,如果B不能转移到A,当且仅当A不等于B且A%B=0
很容易发现当A是素数时,A只不能从1那里转移过来,也就是说素数的转移都是一样的
换句话说,在状态里当长度一定时以每个素数结尾的方案一定是一样的
这就给了我们一些启发,很容易得到结论若两个数的唯一分解式的指数排序后指数序列完全一样
则这两个数的转移一定相同,具体证明可以使用数学归纳法
(我离考试结束快15分钟的时候才证明了这个结论,结果没时间写了,真是悲桑)
我们定义转移相同的数为一个等价类,可以知道m=100000时有160个等价类
这样我们就可以构造一个160*160的矩阵,把转移暴力搞出来之后矩阵乘法加速DP
时间复杂度O(160^3logn),这样写的话在cojs上交会小小的T几个点
虽然时间复杂度分析下来是可以跑的过的
但是我们要进行跟时间复杂度同阶的模操作,这样会大大减慢程序运算速度
之后我们进行一些分析,998244353这个模数<=2^30,相乘<=2^60
如果我们开unsigned long long,那么我们理论上可以进行16次加法之后再做模运算
实际程序实现我采用了每加10次取一次模的方法,这样取模的次数大大缩小了
就可以在cojs上通过了
(虽然卡常数很不厚道,但是鉴于这道题的思路是我从头到尾YY出来的,包括对于常数的优化
所以就这样出在cojs上吧)