Processing math: 100%
【Codeforces 659F】Polycarp and Hay
【Codeforces 639B】Bear and Forgotten Tree 3

【Codeforces 653G】Move by Prime

Zarxdy34 posted @ 2016年4月05日 13:40 in Codeforces with tags 组合数学 , 930 阅读

  由于每个质数之间的操作是相互独立的,所以把每个质数分开考虑。把每个数都质因子分解一遍,时间复杂度是O(nn)

  官方的题解没有讲完,至今不知道它的从k个数到k+1个数是怎么转移的...

  对于质数p,第i个数可表示成ti=paik的形式,其中k与p互质,然后将数组a排序。

  接下来要做的就是从数组a中选出一些数,进行最少的+1,-1的操作使得选出的这些数最终相等。

  显然,我们要让选出的数最终都等于它们的中位数的时候操作次数最少。

  例如,当我们选出的数为b1,b2,b3,,bm时,最少操作次数等于mid1i=1bmidbi+mi=mid+1bibmid

  容易发现,一个数的贡献等于它被加上的次数减去它被减去的次数,乘以这个数本身的值。

  接下来要算的就是一个数最终被加上和减去了多少次。

  考虑ak,如果在ak左边有l个数,在ak右边有r个数,那么

      1.当l<r时,ak对答案贡献次数+1

      2.当l>r时,ak对答案贡献次数-1

      3.当l=r时,ak就是中位数,而且加减次数正好抵消,所以对答案没有贡献。

  思路比较清晰了,计算ak的贡献,就是计算选k左边的数大于和小于k右边的数的方案个数,然后再乘上ak

  考虑这样一个多项式:(1+x)k1(1+x1)nk=(1+x)n1xnk

  利用组合的想法,结果的多项式中x的指数即l-r的值,x指数为正即l>r,系数则表示方案数。

  然后可以得到第k个数对答案的贡献为ak(Cn1n1+Cn2n1++Cnk+1n1Cnk1n1Cnk2n1C0n1)

  最后把一些质数的质数相同的项合并起来瞎JB优化一下就好了。

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter