zoukankan      html  css  js  c++  java
  • [BZOJ5093]图的价值(NTT+第二类Stirling数)

    5093: [Lydsy1711月赛]图的价值

    Time Limit: 30 Sec  Memory Limit: 256 MB
    Submit: 250  Solved: 130
    [Submit][Status][Discuss]

    Description

    “简单无向图”是指无重边、无自环的无向图(不一定连通)。
    一个带标号的图的价值定义为每个点度数的k次方的和。
    给定n和k,请计算所有n个点的带标号的简单无向图的价值之和。
    因为答案很大,请对998244353取模输出。

    Input

    第一行包含两个正整数n,k(1<=n<=10^9,1<=k<=200000)。

    Output

     输出一行一个整数,即答案对998244353取模的结果。

    Sample Input

    6 5

    Sample Output

    67584000

    HINT

    Source

    [Submit][Status][Discuss]

    挺喜欢的一道题,首先从每个点的贡献的角度考虑并列出式子,然后通过Stirling数将幂数转化为下降幂,再交换求和枚举顺序并用组合数公式化简,最后用Stirling数组合意义公式转化成可以FFT的形式,直接套用NTT即可。

    具体参考https://blog.csdn.net/cdsszjj/article/details/79080229

    首先第一步列出式子不难想到,然后观察发现这是一个n项求和,显然不能直接做,第二步引入Stirling数,尽量使关于n的项消去。通过把与n有关的项放在等式最后并变形,成功使枚举上界从n变为min(n,k),大大降低了时间复杂度。但是递推求$O(k)$的Stirling数仍然无法承受,但第二类Stirling数有恰好符合FFT形式的公式,我们另$a[i]=frac{(-1)^i}{i!}$,$b[i]=frac{(m-i)^n}{(m-i)!}$,结果就是最基本的FFT形式:$S[n]=sum_{i=0}^{n}a[i]b[n-i]$。这里将NTT封装起来感觉清晰了不少。

    扯几句题外话:

    1.设$f(n)=sumlimits_{i=1}^n(i,n)$,$g(n)=sumlimits_{d|n}f(d)$,化简$g(n)$。

    $$f(n)=sumlimits_{i=1}^nsumlimits_{d|i d|n}phi(d)=sumlimits_{d|n}phi(d)frac{n}{d}$$到这里我们可以不断带入化简,但是我们其实可以发现:$$f(n)=phi*id$$$$g(n)=I*f=I*(phi*id)=(I*phi)*id=id*id$$所以$$g(n)=sumlimits_{d|n}dfrac{n}{d}$$

    2.几个组合数化简:$$sum_{i=0}^nC_n^iC_i^k=C_n^ksum_{i=k}^nC_{n-k}^{i-k}$$$$sum_{i=0}^aC_a^iC_b^{k-i}=C_{a+b}^k$$$$sum_{i=0}^aC_a^iC_a^i=C_{2a}^i$$$$sum_{i=0}^aC_a^{a-i}C_b^{i+k}=C_{a+b}^{a+k}$$

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define rep(i,l,r) for (int i=l; i<=r; i++)
     4 typedef long long ll;
     5 using namespace std;
     6 
     7 const int N=1000100,mod=998244353,G=3;
     8 int n,k,ans,a[N],s[N],fac[N],fin[N],fn[N];
     9 
    10 int ksm(int a,ll b){
    11     int res;
    12     for (res=1; b; a=(1ll*a*a)%mod,b>>=1)
    13         if (b & 1) res=(1ll*res*a)%mod;
    14     return res;
    15 }
    16 
    17 namespace NTT{
    18     int n,L,rev[N];
    19     void init(int m){
    20         n=1; L=0;
    21         while (n<=m) n<<=1,L++;
    22         for (int i=0; i<n; i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
    23     }
    24     void DFT(int a[],int f){
    25         for (int i=0; i<n; i++) if (i<rev[i]) swap(a[i],a[rev[i]]);
    26         for (int i=1; i<n; i<<=1){
    27             int wn=ksm(G,(f==1)?(mod-1)/(i<<1):(mod-1)-(mod-1)/(i<<1));
    28             for (int p=i<<1,j=0; j<n; j+=p){
    29                 int w=1;
    30                 for (int k=0; k<i; k++,w=1ll*w*wn%mod){
    31                     int x=a[j+k],y=1ll*w*a[i+j+k]%mod; a[j+k]=(x+y)%mod; a[i+j+k]=(x-y+mod)%mod;
    32                 }
    33             }
    34         }
    35         if (f==1) return;
    36         int inv=ksm(n,mod-2);
    37         for (int i=0; i<n; i++) a[i]=1ll*a[i]*inv%mod;
    38     }
    39     void multi(int a[],int b[]){
    40         DFT(a,1); DFT(b,1);
    41         for (int i=0; i<n; i++) a[i]=(1ll*a[i]*b[i])%mod;
    42         DFT(a,-1);
    43     }
    44 }
    45 
    46 int main(){
    47     freopen("bzoj5093.in","r",stdin);
    48     freopen("bzoj5093.out","w",stdout);
    49     scanf("%d%d",&n,&k); n--; fac[0]=fin[0]=fn[0]=1;
    50     rep(i,1,k) fac[i]=1ll*fac[i-1]*i%mod;
    51     fin[k]=ksm(fac[k],mod-2);
    52     for (int i=k-1; i; i--) fin[i]=(1ll*fin[i+1]*(i+1))%mod;
    53     rep(i,1,k) fn[i]=(1ll*fn[i-1]*(n-i+1))%mod;
    54     rep(i,0,k) s[i]=(((i&1)?-1:1)*fin[i]+mod)%mod;
    55     rep(i,0,k) a[i]=(1ll*ksm(i,k)*fin[i])%mod;
    56     NTT::init(2*k+1); NTT::multi(s,a);
    57     rep(i,0,min(n,k)) ans=(ans+1ll*s[i]*fac[i]%mod*fn[i]%mod*fin[i]%mod*ksm(2,n-i))%mod;
    58     printf("%lld
    ",1ll*ans*(n+1)%mod*ksm(2,1ll*n*(n-1)/2)%mod);
    59     return 0;
    60 }
  • 相关阅读:
    如何使用sendEmail发送邮件
    Linux curl命令详解
    linux比较两个文件是否一样(linux命令md5sum使用方法)
    strace命令用法详解
    strace用法说明
    ORA-12154 TNS无法解析指定的连接标识符
    VNC远程连接阿里云Linux服务器 图形界面
    pycharm配置Git 代码管理
    FireFox浏览器-xpath快速定位插件:Xpath Checker
    odoo 前端模板引擎 Qweb
  • 原文地址:https://www.cnblogs.com/HocRiser/p/8661675.html
Copyright © 2011-2022 走看看