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

posted @ 2019-11-11 15:23  G_keng  阅读(107)  评论(0编辑  收藏  举报