zoukankan      html  css  js  c++  java
  • 计数泛做

    生成函数的blogs:https://rqy.moe/Math/gf_correct/

    0.一堆(dp)https://www.cnblogs.com/Lrefrain/p/12123541.html

    1.UOJ 208 UOIP十合一
    问你某张图有多少个边集中不存在环。
    1.DAG
    2.多个边数很少的连通块
    3.多个连通块,且其中仅含有一个环
    4.分层图,每一层仅有4个点
    5.多个强连通分量,每个中的边数很少
    6.完全图
    7.8 n很小的有向图

    1.DAG
    除了重边之外的所有边的个数为(c)
    答案为:$$ans=2^c$$
    2.多个边数很少的连通块
    连通块中暴力枚举边集暴力判断,然后各个连通块的答案乘起来就可以了。
    3.多个连通块,且其中仅含有一个环
    找到每个连通块中的环,然后环上的边不能全选,再乘上剩下所有的边的方案就可以了。
    4.分层图,每一层仅有4个点
    状压连通性。
    (dp[S])为联通状态为(S)的方案。
    然后枚举两层之间的边集判断+转移即可。
    5.多个强连通分量,每个中的边数很少
    和2差不多。
    桥就直接乘2即可。
    6.完全图
    (dp[i])(i)个点的(DAG)生成数目。
    那么得到递推:

    [dp[i]=sumlimits_{j=1}^{i}inom{i}{j}(-1)^{j-1}dp[i-j]2^{j(i-j)} ]

    和主旋律那个题一样,在枚举最后一层来转移。
    7.8 n很小的有向图
    这个就是有向图(DAG)计数,巨神兵的原题了。
    (dp[S])(S)中的(DAG)生成个数,(w[S ightarrow T])点集(S)向点集(T)中的边的个数。
    那么转移有:

    [dp[S]=sumlimits_{Tsubseteq S}(-1)^{|T|-1}dp[S-T]2^{w[T ightarrow S-T]} ]

    在解释一次的话就是说这个容斥的意思是把不同顺序的方案容斥成一个。

    2.UOJ 449 喂鸽子
    好题。
    看一眼就知道是(Min\_Max)容斥是吧。
    然后考虑该怎么做。
    (Min(i))为喂(i)只鸽子最先喂饱一只的期望时间。
    我们要求的答案数组为:(Max(i)),喂(i)只格子最后喂饱那只的期望时间。
    那么直接用(Min\_Max)容斥得到:

    [Max(n)=sumlimits_{i=1}^{n}(-1)^{i-1}inom{n}{i}Min(i) ]

    相当于合并了子集形式的贡献,因为容斥系数都是一样的。
    假设我们只喂(i)只鸽子的话,最先喂饱某一只的期望时间是(f(i))
    那么:

    [Min(i)=frac{n}{i}f(i) ]

    这样我们求出(f(i))即可。
    假设某只鸽子第一个吃饱,那么他一定吃了(K)次。
    设一个生成函数,表示没有鸽子吃饱的情况下,所有的鸽子吃了某个个数的玉米粒的方案:

    [G(x)=sumlimits_{i=0}^{K-1}frac{x^i}{i!} ]

    一个指数生成函数,表示的意思是一只鸽子吃的玉米粒个数为(i)的方案,因为每只鸽子各不相同,所以是指数型生成函数。
    多只鸽子的话直接乘起来就行了。
    我们枚举其他鸽子吃的个数来求(f(i))

    [f(i)=isumlimits_{j=1}^{+infty}inom{j+K-1}{j}(j+k)[x^j]G^{i-1}(x)frac{1}{i^{j+k}} ]

    这个是一个用方案算概率的形式求期望。
    总方案是(frac{1}{i^{j+k}})
    然后插板出除了最后一个玉米的方案是(inom{j+K-1}{j})
    同时对于这(j)个玉米的分配则有:([x^j]G^{i-1}(x)),表示除了吃饱了的那只鸽子,剩下的(i-1)只鸽子吃了(j)个玉米粒的方案。
    然后最后不一定是哪一只吃饱了。
    所以乘(i),鸽子个数。
    这样直接用多项式乘法就行了,复杂度是:(O(n^2Klog(nK)))
    然后还有一种(O(nK))的做法。
    很神仙的(dp)
    把题解直接粘过来了。


    3.UOJ 450 复读机
    不错。
    单位根反演当补个盲区,生成函数也很不错。
    观察数据范围发现是测试点分治。

    (d=1),(ans=k^n)
    (d=2)
    用生成函数(egf)搞一搞。
    一个复读机的生成函数就是:

    [G(x)=sumlimits_{i=0}^{+infty}[2|i]frac{x^i}{i!} ]

    那么答案就是:

    [egin{aligned} ans&=[x^n]G^k(x)\ frac{e^x+e^{-x}}{2}&=sumlimits_{i=0}^{+infty}frac{x^i+(-1)^ix^i}{2i!}\ &=sumlimits_{i=0}^{+infty}[2|i]frac{x^i}{i!}\ ans&=[x^n](frac{e^x+e^{-x}}{2})^k\ &=sumlimits_{i=0}^{k}inom{k}{i}[x^n]e^{(2i-k)x}\ &=sumlimits_{i=0}^{k}inom{k}{i}(2i-k)^n\ end{aligned}]

    这样就可以(O(K))的算了。
    (d=3)
    仍然用生成函数搞一搞。

    [G(x)=sumlimits_{i=0}^{+infty}[3|i]frac{x^i}{i!} ]

    先撇开不管。
    引入单位根反演:
    https://www.cnblogs.com/Lrefrain/p/12285098.html
    OK。现在会单位根反演了。
    那么答案就是:

    [egin{aligned} ans&=[x^n]G^k(x)\ &=[x^n](frac{1}{3}sumlimits_{i=0}^{+infty}frac{x^i}{i!}(sumlimits_{j=0}^{2}w_3^{ij}))^k\ &=[x^n](frac{1}{3}sumlimits_{i=0}^{+infty}frac{(w_3^0x)^i+(w_3^1x)^i+(w_3^2x)^i}{i!})^k\ &=[x^n](frac{1}{3}(e^{w_3^0x}+e^{w_3^1x}+e^{w_3^2x}))^k\ &=sumlimits_{i=0}^{k}inom{k}{i}[x^n]e^{x(k-i)}sumlimits_{j=0}^{i}inom{i}{j}[x^n]e^{jw_3^1x}[x^n]e^{(i-j)w_3^2x}\ &=sumlimits_{i=0}^{k}sumlimits_{j=0}^{i}inom{k}{i}inom{i}{j}(x(k-i)+jw_3^1+(i-j)w_3^2)^n\ end{aligned}]

    直接(k^2)暴力算就可以了。
    然后单位根的话,取模意义下就用原根来做。
    这里(3|phi),所以(w_3^1=g^{frac{phi}{3}})
    然后就解决了。

    4.LOJ 咱们去烧菜吧
    是我之前不会的那种背包。(现在会了)
    要求对不同的背包容量做混合背包。
    (G(x))为答案的生成函数,我们首先可以列出这样的式子:

    [G(x)=prodlimits_{i=1}^{m}sumlimits_{j=0}^{b_i}(x^{a_i})^j ]

    然后加一点级数求和,可以直接推式子了。

    [egin{aligned} G(x)&=prodlimits_{i=1}^{m}left(frac{1-x^{a_i(b_i+1)}}{1-x^{a_i}} ight)\ &=expleft(lnleft(prodlimits_{i=1}^{m}left(frac{1-x^{a_i(b_i+1)}}{1-x^{a_i}} ight) ight) ight)\ &=expleft(sumlimits_{i=1}^{m}left(ln(frac{1-x^{a_i(b_i+1)}}{1-x^{a_i}}) ight) ight)\ &=expleft(sumlimits_{i=1}^{m}ln(1-x^{a_i(b_i+1)})-ln(1-x^{a_i}) ight)\ &=expleft(sumlimits_{i=1}^{m}sumlimits_{j=1}^{+infty}frac{x^{a_ij}-x^{a_i(b_i+1)j}}{j} ight)\ w_i&=sumlimits_{j=1}^{m}[a_j=i]-[a_j(b_j+1)=i]\ W(x)&=sumlimits_{i=0}^{n}w_ix^i\ G(x)&=expleft(sumlimits_{j=1}^{n}frac{1}{j}sumlimits_{i=1}^{n}w_ix^{ij} ight)\ &=expleft(sumlimits_{j=1}^{n}frac{1}{j}W(x^j) ight)\ end{aligned}]

    然后(O(nln n))预处理一下就可以直接上(exp)了。
    复杂度是(O(nln n+nlogn))

    5.LOJ 6358 前夕
    还是单位根反演。
    (发现套路了就是整除计数不是莫比乌斯就是单位根反演)
    (n)个数一定被选其他数不一定被选的方案是:

    [g(i)=inom{n}{i}(2^{2^{n-i}}-1) ]

    然后构造容斥系数(f(i))使得:

    [ans=sumlimits_{i=0}^{n}f(i)g(i) ]

    那么对于一个恰好选了(i)个方案来说。
    他被这种计数方式记录的次数应当满足的条件为:

    [[4|i]=sumlimits_{j=0}^{i}inom{i}{j}f(j) ]

    二项式反演一下:

    [f(i)=sumlimits_{j=0}^{i}(-1)^{i-j}inom{i}{j}[4|j] ]

    然后单位根反演一下,改变枚举顺序并二项式定理合起来:

    [egin{aligned} f(i)&=sumlimits_{j=0}^{i}(-1)^{i-j}inom{i}{j}frac{1}{4}sumlimits_{k=0}^{3}w_4^{jk}\ &=frac{1}{4}sumlimits_{k=0}^{3}sumlimits_{j=0}^{i}(-1)^{i-j}inom{i}{j}(w_4^{k})^j\ &=frac{1}{4}sumlimits_{k=0}^{3}(w_{4}^{k}-1)^i\ end{aligned}]

    然后回代就可以算了。
    这样复杂度是线性的,但是容易被卡常。

    6.小朋友与二叉树
    设一个点的生成函数为:

    [G(x)=sumlimits_{iin S}x^i ]

    设权值和大小为(i)的方案数(f_i)的生成函数为:

    [F(x)=sumlimits_{i=0}^{+infty}f_ix^i ]

    那么有:

    [f_i=sumlimits_{j,k}f_jf_k[(i-j-k)in S] ]

    这样的话就是说:

    [F(x)=F^2(x)G(x)+1 ]

    解得:

    [F(x)=frac{1pmsqrt{1-4G(x)}}{2G(x)} ]

    然后发现如果是减法的话,等式的常数项必然为0,不是正解舍去。
    那么:

    [F(x)=frac{1+sqrt{1-4G(x)}}{2G(x)} ]

    7.某集训队作业题
    对于集合(S),定义(w(S)=prodlimits_{xin S}x)
    定义(F(n,k)=sumlimits_{Ssubseteq [n],|S|=k}w(S))
    对于给定的质数(P),对于(forall iin[0,P-1]),求存在多少个(kin[0,n]),满足(F(n,k)equiv i(mod P))
    (nleq 10^{18},pleq 10^5)
    神仙题。
    (G_n(x))(F(n,k))的生成函数。
    也就是说:

    [G_n(x)=sumlimits_{i=0}^{+infty}F(n,i)x^i ]

    [F(n,k)=F(n-1,k-1)n+F(n-1,k) ]

    等价于:

    [G_n(x)=nxG_{n-1}(x)+G_{n-1}(x)=(nx+1)G_{n-1}(x) ]

    也就是说:

    [G_{n}(x)=prodlimits_{i=1}^{n}(ix+1) ]

    把系数转置一下:

    [G_{n}(x)=prodlimits_{i=1}^{n}(x+i) ]

    (n=ap+b)
    那么:

    [G_{n}(x)=left(prodlimits_{i=0}^{p-1}(x+i) ight)^aleft(prodlimits_{i=1}^{b}(x+i) ight) ]

    考虑前面这一部分:

    [prodlimits_{i=0}^{p-1}(x+i) ]

    也就是说,要求一个式子和这个式子一样,使得其再(mod p)意义下的解集是([0,p-1])
    费马小定理。

    [xprodlimits_{i=1}^{p-1}(x+i)equiv x^{p}-x(mod p) ]

    然后求后半部分。
    发现可以直接倍增来搞。
    前面的部分并不好统计,是这样的形式的((y-1)^a)
    但是(a)很大。
    先用二项式定理展开一下:

    [(y-1)^a=sumlimits_{i=0}^{a}inom{a}{i}y^i(-1)^{a-i} ]

    然后这个组合数尝试代入卢卡斯定理。

    [egin{aligned} (y-1)^a&=sumlimits_{i=0}^{a}prodlimits_{j=1}^{log_pa}inom{a_j}{i_j}y^{i_jp^j}(-1)^{(a_j-i_j)p^j}\ &=prodlimits_{j=1}^{log_pa}sumlimits_{i_j=0}^{p-1}inom{a_j}{i_j}y^{i_jp^j}(-1)^{(a_j-i_j)p^j}\ end{aligned}]

    这样就变成(log_pa)个多项式相乘了。
    我们可以直接用卷积统计系数分布。

    8.概率论
    本质不同二叉树个数是卡特兰数(g_n)
    相当于是考虑左右孩子的大小。

    [g_n=sumlimits_{i=0}^{n-1}g_ig_{n-i-1} ]

    这是卡特兰数的定义式。
    (n)个点所有方案下含有的叶子数目的和为(f_n)

    [f_n=sumlimits_{i=0}^{n-1}f_ig_{n-i-1}+g_{i}f_{n-i-1} ]

    设生成函数分别为(F(x),G(x))
    那么就是说:

    [F(x)=2xF(x)G(x)+x ]

    最后的(+x)是考虑当前这个点就是叶子的情况。
    卡特兰数的通项公式是(G(x)=frac{1-sqrt{1-4x}}{2x})
    那么:

    [F(x)=2xF(x)G(x)+x ]

    然后解得:(F(x)=x(G(x))')
    也就是说(f_n=ng_{n-1})
    所以答案就是:
    (ans=frac{ng_{n-1}}{g_n})
    直接代入卡特兰数即可:
    (ans=frac{n^2+n}{4n-2})

  • 相关阅读:
    手机号 验证(正则)
    静态库相关
    添加友盟SDK,实现新浪分享和微信朋友圈分享的关键代码
    删除Mac 系统中多出得MobileBackups 文件夹
    浏览器判断检测手机中是否安装了ios/android客户端程序
    浏览器判断是否安装了ios/android客户端程序
    自定义TextField的删除按钮
    应用崩溃日志解析
    关于UITextView的一些问题
    关于UIColor这个类的一些不知道的事
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/12274363.html
Copyright © 2011-2022 走看看