csp-s模拟84

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正确的有多少个
  麻烦的在于解方程,考试时是手解的,其实可以用高斯消元

原文地址:https://www.cnblogs.com/Gkeng/p/11834874.html