zoukankan      html  css  js  c++  java
  • [集训队作业2019] 青春猪头少年不会梦到兔女郎学姐

    题意

    给定(n)及长度为(n)的序列({a_i})(a_i)表示有(a_i)(i)类糖果。
    (sum a_i)个糖果,排成一个序列(同种糖果没有分别)。
    对于某种序列,其权值为将序列看成环,所有极长段长度的乘积。
    ({1,1,2,3,4,4,1}),权值为(3 imes 1 imes 1 imes 2=6)
    求所有序列的权值之和。
    注意:虽然权值与环有关,但({1,1,2,3,4,4,1})({1,1,1,2,3,4,4})是两种不同的序列。
    (sum a_ile 2 imes 10^5)
    (2le nle 2 imes 10^5)

    做法一

    注意,我们到最后再讨论时间复杂度,在此之前,想办法得到一个多项式复杂度做法

    考虑一个超级弱化版(( ext{CF840C})):

    给定(n)及序列(a_i)(a_i)表示有(a_i)(i)类糖果。
    (sum a_i)个糖果,排成一个序列(同种糖果没有分别)。
    求序列上相邻位置不同的方案数。

    考虑容斥,钦定每种通过至多分成了(j)段:

    [ans=sumlimits_{k=1}^{infty}k![x^k]prodlimits_{i=1}^n (sumlimits_{j=1}^{a_i}(-1)^{a_i-i}{a_i-1choose j-1}frac{x^j}{j!}) ]

    再考虑一个弱化版

    给定(n)及序列(a_i)(a_i)表示有(a_i)(i)类糖果。
    (sum a_i)个糖果,排成一个序列(同种糖果没有分别)。
    对于某种序列,其权值为序列上所有极长段长度的乘积。
    求所有序列的权值之和。

    我们枚举每种糖果(a)个分成了(k)段,贡献记为(sumlimits [1le x_1,cdots,x_kle a][sum x_i=a]x_1cdots x_k)
    这个贡献可以写成简单形式的,考虑组合意义,分成(k)段后,每段再选一个位置:

    [{a+k-1choose 2k-1} ]

    写成生成函数:

    [F_a(x)=sumlimits_{i=1}^{a}{a+i-1choose 2i-1}sumlimits_{j=1}^i (-1)^{i-j}{i-1choose j-1}frac{x^j}{j!} ]

    那么:

    [ans=sumlimits_{k=1}^{infty}k![x^k]prodlimits_{i=1}^n F_{a_i}(x) ]

    再考虑原题

    我们假定一个颜色(i)是在序列的开头,假设环上这一段长度为(x),那么在序列上就有(x)种方案,
    我们枚举每种糖果(a)个在环上分成了(k)段,贡献记为(sumlimits [1le x_1,cdots,x_kle a][sum x_i=a]x_1^2cdots x_k)
    (x_1^2=2{x_1choose 2}+x_1)得到组合意义,也可以写成简单形式:

    [2{a+k-1choose 2k}+{a+k-1choose 2k-1} ]

    由于我们算的是环上的段数,所以要保证第一段与最后一段是不相邻的,在后面增加一段虚段,那么序列上虚段与最后一段不相邻,就可以保证环上第一段与最后一段不相邻。

    写成生成函数:

    [G_a(x)=sumlimits_{i=1}^a 2{a+i-1choose 2i}+{a+i-1choose 2i-1}sumlimits_{j=2}^{i+1}(-1)^{(i+1)-j}{ichoose j-1}frac{x^j}{(j-2)!} ]

    由于第一段与最后一段已经钦定好了,这里(x^j)自带的系数为((j-2)!)

    那么答案为:

    [ans=sumlimits_{k=2}^{infty}(k-2)![x^k]sumlimits_{i=1}^n G_{a_i}(x)prodlimits_{j eq i}F_{a_j}(x) ]

    由于第一段与最后一段已经钦定好了,这里是乘((k-2)!)

    对于(F_{a}(x),G_{a}(x))均可以(O(aloga))得出
    然后可以分治( ext{fft})(O(sum a log^2(sum a)))得到答案。

    做法二

    大体思路同上,做法一由于要格外记录是否选过(G_a(x)),自带三倍常数。

    如果我们考虑钦定第一种糖果放在开头,且末尾不为第一种糖果,那么环的权值就转换成了序列的权值。

    定义第一个位置为第一种糖果且最后一个位置不为第一种糖果为好序列

    可以容斥计算,第一种糖果在开头,且末尾不为第一种糖果的贡献,即:钦定开头为第一种糖果减去钦定开头和末尾均为第一种糖果。

    现在我们得到了所有好序列的贡献。
    现在单独看某一个好序列,令(len)为其最小正周期。
    这个好序列,在总序列集合,有本质不同的(len)种形态,而在好序列集合中不然:

    其有((sum a_i)/len)个周期,假设该种方案第一种糖果分成了(k)段,那么每个周期含有(k/((sum a_i)/len))段第一种糖果,显然在好序列集合中,只有(k/((sum a_i)/len))种本质不同的形态。

    解决的方法是,在定义第一种糖果的(F_{a_1}(x))时,在钦定出现(k)段第一种糖果那里,直接乘上(frac{1}{k})的系数。最后给答案乘上(sum a_i),则每种好序列被恰好统计了(len)次,即得到了正确结果。

  • 相关阅读:
    linux上TCP connection timeout的原因查找
    AC-BM算法原理与代码实现(模式匹配)
    URPF技术白皮书
    漫谈协同过滤推荐算法
    自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用
    推荐系统的常用算法,选择,漫谈,推荐系统开源软件汇总
    MySQL索引原理及慢查询优化
    深入详解SQL中的Null
    《Gulp 入门指南》 : 使用 gulp 压缩 JS
    Process Explorer
  • 原文地址:https://www.cnblogs.com/Grice/p/14432652.html
Copyright © 2011-2022 走看看