• 组合/概率/形式幂级数/多项式/集合幂级数的题


    JZOJ5520 Every one will meet some difficult

    原题TCO2013 3A TrichyInequality

    Description

    满足(sumlimits_{i = 1}^m {a_i} le S 且 forall i, a_i > 0, forall i le n, a_i le T)(a)的解的组数
    (n le m le 10^9, T le 10^5, n imes T le S le 10^{18}, m − n le 1000)

    Solution

    转自
    容斥,枚举前面多少个(a)超过了(T)的限制

    [Answer = sumlimits_{i = 0}^n {(-1)^i inom{n}{i} inom{S - iT}{m}} ]

    考虑上面容斥的式子用另一种组合意义来描述

    • (S)个位置,每个位置可以是(0/1),这些位置分成(n + 1)块,前n块每块有(T)个位置,最后一块有(S - nT)个位置,现在要选出(m)个位置来放(1),前面n块要求每一块中至少有一个(1),问方案数

    此时这个容斥就相当于枚举前面有多少块是没有放1的,显然这式子也是成立的
    考虑生成函数,前(n)块每一块的生成函数就是((1 + x)^T − 1),最后一块的生成函数就是((1 + x)^{S − nT})
    现在要求的就是多项式(((1 + x)^T − 1)^n (1 + x)^{S − nT})(x^m)项系数

    那么这个(m − n le 1000)该怎么用呢?
    观察上面的多项式前面括号里的部分,发现它常数项是(0)
    这也就意味着整个多项式(0)次到(n - 1)次的系数全是(0)
    那么我们将这个多项式除以(x^n)
    现在要求的就是$$[x^{m - n}]frac{((1 + x)^T − 1)^n (1 + x)^{S − nT}}{x^n}$$

    那么我们暴力用快速幂来做,每次乘完只保留(x^{m − n + 1})以下的项,除以(x^n)实际上就是在乘(n)次方之前将所有项左移一位
    这样就在((m − n)^2 (log n + log(S − nT)))的时间内做完啦
    还可以采用NTT优化(需要用任意模数NTT)



    2019省选联合训练10 T2 K菌的游戏

    link

    Description

    一棵有根树,满足每个点的标号小于其父亲的编号。初始时石子在根上,两人轮流向儿子移动,不能移动的输。计数。

    Solution

    设先手必胜的EOF为(f(x))
    满足(f'(x) + exp(f(x)) = frac{1}{1 - x})
    两边积分得(f(x) + int exp(f(x)) dx = -ln(1 - x))
    可以发现(int exp(f(x)) dx)就是先手必败的EOF,记其为(g(x))

    所以原式变为( egin{cases} f(x) + g(x) = -ln(1 - x) (1) \ g(x) = int exp(f(x)) dx (2) end{cases})
    对(2)两边求导得(g'(x) = exp(f(x)))
    两边取ln得(ln(g'(x)) = f(x))
    代入(1)得(g(x) + ln(g'(x)) = -ln(1 - x))
    两边exp得(exp(g(x)) g'(x) = frac{1}{1 - x})
    两边积分得(int exp(g(x)) g'(x) dx = int frac{1}{1 - x} dx)
    ((exp cdot g)'(x) = exp(g(x)) g'(x))可得(exp(g(x)) = int frac{1}{1 - x} dx)
    两边取ln得(g(x) = ln(int frac{1}{1 - x} dx + 1))
    (g(x) = ln(sumlimits_{i = 1}^{infty} frac{x^i}{i} + 1))



    THUWC2018 Day2T2 sequence 七彩序列

    Description

    (n)种颜色的小球,第(i)种有(a_i)个,现在询问不存在任意一个非空前缀或者非空后缀满足(n)种颜色的小球出现的次数相同的排列的方案数对(998244353)取模
    (比如112122111111不合法,因为前缀112122中,两种颜色都出现了3次)
    (n le 100, a_i le 20000)

    Solution

    显然对后缀的要求可以转化为对前缀的要求
    (A = min a_i, B = max a_i)
    (f_i)为每种颜色都为(i)的只包含一个不合法位置(就是第(n imes i)位)的方案数
    (g_i)为第(j)种颜色为(a_j - A + i)的只包含一个不合法位置(就是第(sum_{j = 1}^{n} {i + a_j - A})位)的方案数
    显然有(f_i = frac{(in)!}{(i!)^k} - sumlimits_{j = 1}^{i - 1} {f_j frac{((i - j)n)!}{((i - j)!)^k}} - sumlimits_{j = 1}^{i + A - B} {g_j frac{(sumlimits_{k = 1}^{n} {i - j + A - a_k})!}{prodlimits_{k = 1}^{n} {(i - j + A - a_k)!}}})
    (g_i = frac{(sumlimits_{j = 1}^{n} {i + a_j - A})!}{prodlimits_{j = 1}^{n} {(i + a_j - A)!}} - sumlimits_{j = 1}^{i - 1} {g_j frac{((i - j)n)!}{((i - j)!)^k}} - sumlimits_{j = 1}^{i} {f_j frac{(sumlimits_{k = 1}^{n} {i - j + a_k - A})!}{prodlimits_{k = 1}^{n} {(i - j + a_k - A)!}}})
    不妨记(u(i) = egin{cases} 0 & i < 0 \ frac{(in)!}{(i!)^k} & i ge 0 end{cases}, v(i) = egin{cases} 0 & i < B - A \ frac{(sumlimits_{k = 1}^{n} {i + A - a_k})!}{prodlimits_{k = 1}^{n} {(i + A - a_k)!}} & i ge B - A end{cases}, w(i) = egin{cases} 0 & i < 0 \ frac{(sumlimits_{j = 1}^{n} {i + a_j - A})!}{prodlimits_{j = 1}^{n} {(i + a_j - A)!}} & i ge 0 end{cases})
    上面的递推式可以简写为(f_i = u(i) - sumlimits_{j = 1}^{i - 1} {u(i - j) f_j} - sumlimits_{j = 1}^{i - 1} {v(i - j) g_j})
    (g_i = w(i) - sumlimits_{j = 1}^{i - 1} {u(i - j) g_j} - sumlimits_{j = 1}^{i} {w(i - j) f_j})
    这递推具有卷积形式,于是就可以愉快的分治FFT了
    有一种特殊情况,当所以颜色的个数都一样时,(g)是没有用的,不要算
    太懒了,不想写代码,我也不能保证以上做法是正确的



    美丽的一道期望题

    Description

    (n)个点的图,每个点有一个点权(w_i),任意两个点之间都有(frac{1}{2})的概率相连,定义一个联通块的权值为这个联通块内最小的点权,定义一个图的权值为权值最大的联通块的权值,求图的期望权值
    (n le 10^5),对(998244353)取模

    Solution

    将期望转化为计数
    将所有点权从小到大排序
    (f_i)(i)个点的联通图的方案数
    (g_i)(i)个点的所有情况的((-1)^{联通块个数})之和
    (h_i)为第(i)个点为它的联通块内最小的元素,它所在的联通块为权值最大的联通块的方案数

    显然有(f_0 = 0, f_i = 2^{inom{i}{2}} - sumlimits_{j = 1}^{i - 1} {inom{i - 1}{j - 1} 2^{inom{i - j}{2}} f_j})
    (g_0 = 1, g_i = -sumlimits_{i = 1}^{n} {inom{i - 1}{j - 1} f_j g_{i - j}})
    考虑容斥,根据(sumlimits_{i = 0}^{k} inom{k}{i} (-1)^i = [k = 0])
    (h_i = -sumlimits_{j = 0}^{n - i} {inom{n - i}{j} 2^{inom{n - j}{2}} g_{j + 1}})

    (f, g)可以直接分治FFT,(h)卷积一下就可以了,时间复杂度(O(n log^2 n))

    (A = sumlimits_{i = 0}^{infty} {2^{inom{i}{2}} x^i})
    (f)求逆可得,也等于(ln A)
    (g = exp {-f} = frac{1}{exp f} = frac{1}{A})
    (f, g)均可求逆得,(h)再卷积一下
    总得时间复杂度为(O(n log n)),复杂度优秀,只需要求逆,常数优秀



    PKUWC2018 猎人杀

    link

    Description

    给你(n)个球,每个球有个权重(w_i)​,每次加权随机扔掉一个球,求一号球是最后一个被扔出去的概率
    (sumlimits_{i = 1}^{n} {w_i} le 10^5, forall i in [1, n], w_i > 0)

    Solution

    直接求会发现分母不一样,不好算
    我们可以将模型转化,每次加权随机选择一个球,球可以重复被选,若这个球还在就把它扔掉,求一号球是最后一个被扔出去的概率
    令全集为(U)(sum(S) = sumlimits_{i in S}^{} {w_i}),当前状态下被扔掉的球的集合为(S)
    选到第(i(i otin S))个球的概率为(p),则(p = frac{sum(S)}{sum(U)} p + frac{w_i}{sum(U)} Rightarrow p = frac{w_i}{sum(U) - sum(S)})
    可以发现这与原题要求的概率相同,即这两个模型是等价的

    接下来考虑容斥,枚举一定在一号球之后被扔掉的球的集合(T)

    [ans = sumlimits_{T subseteq U}^{} {(-1)^{|T|} sumlimits_{i = 0}^{infty} (1 - frac{w_1 + sum(T)}{sum(U)})^i frac{w_1}{sum(U)}} ]

    [= sumlimits_{T subseteq U}^{} {(-1)^{|T|} frac{w_1}{w_1 + sum(T)}} ]

    分治FFT计算类似于背包的部分即可
    (m = sumlimits_{i = 1}^{n} {w_i}),时间复杂度(m log^2 m)
    也可以手动展开(ln),再(exp)回去,时间复杂度为(m log m)

    Extention

    用这个套路也可以解决UOJ#390. 【UNR #3】百鸽笼



  • 相关阅读:
    python---基础部分
    自动化测试---Selenium IDE安装及操作
    自动化测试---Selenium IDE概念
    自动化测试----概念
    jmeter---后端监听器
    jmeter---分布式测试
    jmeter---runtime控制器
    什么是 MyBatis 的接口绑定,有什么好处?
    接口绑定有几种实现方式,分别是怎么实现的?
    Apache Shiro 的三大核心组件
  • 原文地址:https://www.cnblogs.com/tkandi/p/10681075.html
Copyright © 2020-2023  润新知