csp-s模拟84

T1:

  考虑如何能按顺序生成光滑数。对每个质数用队列维护包含此质数的候选集合,每次从所有队首取出最小的作为一个光滑数,用每个质数乘上这个光滑数并加入相应候选集合。这样不会漏掉一个光滑数,但会有重复。比如取到光滑数$3$,乘上$2$加入了$2$的队列,而取到$2$时同样乘$3$加入$3$的队列。如果规定一个数只由自己最小的质因数产生就可以去重。

T2:

  状压$dp$。首先序列是按顺序依次插数的,就是说调换前后顺序可能会不合法。考场上打的$dp$没注意这一点,做成了排列问题,调了一个多小时过不了样例才发现。

  状态不好设。只用一个约数出现的次数表示状态还不行,需要知道哪几个约数是在同一个数中的。于是就再加一维表示那些约数对在不同数中出现,这样加入一个新数时,就能判断与其不互质的数是否超过$1$。即如果新数的两个约数在不同的数中出现过,与新数不互质的个数就为$2$。

  状态一共有$27$位,压个$int$用哈希表存,实际状态很少。

T3:

  思路新颖的一道题。能嗅到很强的乱搞题气息,但搞得有理有据。合法方案是出错点数不过半,就是说随便一个点在合法方案变换成功的概率有$1/2$以上。变换前后可以列方程,用两个点列出四个,解出$dx,dy,\sin(\theta)scale,\cos(\theta)scale$,三角函数求出$\theta$,代出$scale$,验证是否合法。

  精度稍炸,多测$10$组取平均值。$tan2$函数传入$sin,cos$值能确定角的象限。

posted @ 2019-10-24 07:57  DuanYue  阅读(113)  评论(0编辑  收藏  举报