• [atAGC106F]Figures


    考虑purfer序列,若生成树的pufer序列为$p_{i}$,则答案为$(prod_{i=1}^{n}a_{i})sum_{p}prod_{i=1}^{n}frac{(a_{i}-1)!}{(a_{i}-1-s_{i})!}$(其中$s_{i}$为$p$中点$i$出现的次数,即度数减1)

    (以下令$a_{i}$减1)观察到式子只与$s_{i}$有关,对于相同的$s_{i}$对应$p_{i}$有$frac{(n-2)!}{prod_{i=1}^{n}s_{i}!}$种,令$C=(n-2)!prod_{i=1}^{n}a_{i}$,代入即$ans=Csum_{sum_{i=1}^{n}s_{i}=n-2}prod_{i=1}^{n}frac{a_{i}!}{s_{i}!(a_{i}-s_{i})!}$

    令$f(x)=sum_{k=0}^{n-2}(sum_{sum_{i=1}^{n}s_{i}=k}frac{a_{i}!}{s_{i}!(a_{i}-s_{i})!})x^{k}=sum_{s_{i}}prod_{i=1}^{n}frac{a_{i}!}{s_{i}!(a_{i}-s_{i})!}cdot x^{s_{i}}$,答案即$f(x)[x^{n-2}]$

    不妨先枚举$s_{1},s_{2},..$,再提取出对应位置上的式子作为公因式,之后由于各位上完全独立,再将结果乘起来就是原式,即$f(x)=prod_{i=1}^{n}sum_{s_{i}=0}^{a_{i}}frac{a_{i}!}{s_{i}!(a_{i}-s_{i})!}cdot x^{s_{i}}=(1+x)^{sum_{i=1}^{n}a_{i}}$

    因此$f(x)[x^{n-2}]=c(sum_{i=1}^{n}a_{i},n-2)$(注意这里的$a_{i}$减了1),发现$(n-2)!$已经被抵消掉,因此直接枚举$sum_{i=1}^{n}a_{i}$到$sum_{i=1}^{n}a_{i}-(n-2)+1$即可

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define mod 998244353
     4 int n,x,s,ans;
     5 int main(){
     6     scanf("%d",&n);
     7     ans=1;
     8     for(int i=1;i<=n;i++){
     9         scanf("%d",&x);
    10         ans=1LL*ans*x%mod;
    11         s=(s+x-1)%mod;
    12     }
    13     for(int i=0;i<n-2;i++)ans=1LL*ans*(s-i+mod)%mod;
    14     printf("%d",ans);
    15 }
    View Code
  • 相关阅读:
    为上次写的框架加了一个辅助功能
    复制文件夹下所有文件
    进制之间的相互转换
    c# 修改appConfig文件节点
    GUID
    太悲哀了
    poj2411 Mondriaan's Dream
    poj3311 Hie with the Pie
    HDU3001 Travelling
    luogu p2622关灯问题II
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/13890555.html
Copyright © 2020-2023  润新知