T1:
很容易想到直接开个堆,每次把最小的数取出,再分别乘上大于等于该数最大质因子的所有质数,把这些数再塞回堆里
发现TLE了……
需要一个(O(n))的算法,考虑在题目中寻找单调性(蚯蚓???)
设第i次取出的数为(x_i),那么对于任意(j<i),(x_j<x_i),那么(x_j*p_k<x_i*p_k)
发现对于乘以同一个质数所产生的新数是单调的,所以可以用B个队列存储,每次比较所有队头元素
复杂度从(O(nlogn))变为(O(nB))(???)
T2:
毒瘤题
考虑设计状态(f_{s,t})表示已经有的质因数集合是s,已经有的在不同数中出现的质因数对集合为t
发现s的大小是(2^6),t的大小是(2^{(^6_2)+6}),发现存不下
但考虑定义会发现有很多状态是不合法的,所以可以记忆化搜索或用hash表存状态
具体转移可以枚举新加入的数所包含的质因数集合news,转移需满足该集合内出现的数对集合不能与原状态的t有交集
若可以转移,那么新状态的(s'=s|news),(t'=t|f_{s,news})
(其中(f_{i,j})表示i集合与j集合所产生的新数对)
新状态的方案数即为原方案数乘以news的质因子集合的指数之积
T3:
考虑正确的很多,所以可以随机化,随机选两组,然后计算出各个参数后check正确的有多少个
麻烦的在于解方程,考试时是手解的,其实可以用高斯消元