zoukankan      html  css  js  c++  java
  • loj6391

    题意

    (n)个点的树,初始有(a,b)两点是黑色的,其他是白色的,每次可以将某个与黑色节点相邻的某个白色节点染黑。一个方案不同当且仅当某一回合染黑的点不同。求将所有点染黑的方案数。对(998244353)取模。(n,a,ble 234567)(8s)

    做法

    考虑若(a=b),将(a)置为根节点
    (f_i)为若(i)节点为黑色,将(i)子树内的点全部染黑的方案数。令(s_i)(i)子树大小
    显然有:(f_i=(s_i-1)!prodlimits_{vin son_i}frac{f_v}{s_v!}Longrightarrow frac{f_i}{s_i!}=frac{1}{s_i}prodlimits_{vin son_i}frac{f_v}{s_v!})。根据归纳显然有(ans=f_1=frac{n!}{prodlimits_{i=1}^n s_i})

    考虑(a eq b),建一个虚点(s),连接(a-b),就形成了一棵基环树
    题目等价于开始只有(s)一个黑点,然后染色。
    枚举基环上的一条边,然后断开,方案数之和显然是原答案的两倍

    考虑断开后,答案为(frac{(n+1)!}{(prodlimits_{i=1}^n s_i)(n+1)}=frac{n!}{prodlimits_{i=1}^n s_i}),不需要考虑虚点
    (s)的变化实际只出现在基环上的点(a_1,a_2,cdots ,a_m),令(s_i)为i节点不在基环上的子树大小,令(x_i=sumlimits_{k=1}^i s_i(s_0=0))
    若将(j,j+1)断开,则子树乘积为(|x_j-x_0| imes |x_j-x_1| imes cdots imes |x_j-x_{j-1}| imes |x_j-x_{j+1}| imescdots imes |x_j-x_{m}|=prodlimits_{i=0,i eq j}^m|x_j-x_i|=(-1)^{m-j}prodlimits_{i=0,i eq j}^m(x_j-x_i))

    构造多项式(f(x)=sumlimits_{j=0}^m prodlimits_{i=0,i eq j}^m(x-x_i)),满足将(f(x_j)=prodlimits_{i=0,i eq j}^m(x_j-x_i)),发现(f(x)=(prodlimits_{i=0}^m (x-x_i))')

    然后分治fft+多点求值即可

    题外话

    好久没打多项式了...码力好差...多项式求逆是(mod~x^{n-1+m-1+m-1+1})

  • 相关阅读:
    Scrapy数据持久化
    Mybatis源码与Spring源码中设计模式的应用总结
    Count-Min Sketch 算法
    加解密算法、消息摘要、消息认证技术、数字签名与公钥证书
    智能卡系统设计(一) 断电保护和数据备份
    TCP/IP协议——ARP详解
    DES算法详解
    Python调用外部程序——os.system()和subprocess.call()
    Python实现截图
    Linux笔记:SSH客户端断开配置
  • 原文地址:https://www.cnblogs.com/Grice/p/12793913.html
Copyright © 2011-2022 走看看