• [atARC133F]Random Transition


    定义$x$为$n$个01变量中1的个数,那么翻转一个01变量对$x$的影响恰与操作相同

    换言之,记$P(a,b)$为初始有$a$个1且翻转$k$次后有$b$个1的概率,则$ans_{i}=\sum_{j=0}^{n}\frac{A_{j}}{10^{9}}P(j,i)$

    构造二元生成函数(以操作次数和1的个数为变量),则$P(a,b)=\frac{k!}{n^{k}}[x^{k}y^{b}]G_{0}^{a}G_{1}^{n-a}(x,y)$

    (其中$G_{p}$表示单个01变量$p$的生成函数,即$G_{p}(x,y)=\sum_{i\equiv p(mod\ 2)}\frac{x^{i}}{i!}+\sum_{i\not\equiv p(mod\ 2)}\frac{x^{i}y}{i!}$)

    将其代入答案,记$F=\sum_{j=0}^{n}A_{j}G_{0}^{j}G_{1}^{n-j}$,则$ans_{i}=\frac{k!}{10^{9}n^{k}}[x^{k},y^{i}]F(x,y)$

    构造$P(x,y)=(y+1)e^{x}$和$Q(x,y)=(y-1)e^{-x}$,进而即$G_{0}=\frac{P+Q}{2}$且$G_{1}=\frac{P-Q}{2}$

    将其代入$F$,即$F=\frac{1}{2^{n}}\sum_{j=0}^{n}A_{j}(P+Q)^{j}(P-Q)^{n-j}$​,展开后即
    $$
    F=\frac{1}{2^{n}}\sum_{j=0}^{n}\left([x^{j}]\sum_{i=0}^{n}A_{i}(x+1)^{i}(x-1)^{i}\right)P^{j}Q^{n-j}
    $$

    将$P,Q$的式子代入$P^{j}Q^{n-j}$,即$(y+1)^{j}(y-1)^{n-j}e^{(2j-n)x}$,其$k$次项系数为$\frac{(2j-n)^{k}}{k!}$

    再将其代入答案,记$w_{j}=(2j-n)^{k}[x^{j}]\sum_{i=0}^{n}A_{i}(x+1)^{i}(x-1)^{i}$,则
    $$
    ans_{i}=\frac{1}{10^{9}n^{k}2^{n}}[y^{i}]\sum_{j=0}^{n}w_{j}(y+1)^{j}(y-1)^{n-j}
    $$
    关于$w_{j}$和$ans_{i}$的计算是类似的,问题即给定$\{z_{i}\}$,求多项式$f(x)=\sum_{i=0}^{n}z_{i}(x+1)^{i}(x-1)^{n-i}$

    以$x-1$为整体,即
    $$
    f(x)=\sum_{i=0}^{n}z_{i}((x-1)+2)^{i}(x-1)^{n-i}=\sum_{i=0}^{n}z_{i}\sum_{j=0}^{i}{i\choose j}2^{j}(x-1)^{n-j}=\sum_{j=0}^{n}2^{j}\left(\sum_{i=j}^{n}z_{i}{i\choose j}\right)(x-1)^{n-j}
    $$
    记$z'_{n-j}=2^{j}\sum_{i=j}^{n}z_{i}{i\choose j}$,可以使用多项式乘法计算,进而将$x-1$​展开,也即
    $$
    f(x)=\sum_{i=0}^{n}z'_{i}(x-1)^{i}=\sum_{i=0}^{n}z'_{i}\sum_{j=0}^{i}(-1)^{i-j}{i\choose j}x^{j}=\sum_{j=0}^{n}\left(\sum_{i=j}^{n}(-1)^{i-j}z'_{i}{i\choose j}\right)x^{j}
    $$
    $\sum_{i=j}^{n}(-1)^{i-j}z'_{i}{i\choose j}$也可以类似地使用多项式乘法计算,时间复杂度为$o(n\log n)$,可以通过

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define N (1<<18)
     4 #define mod 998244353
     5 #define ll long long
     6 int n,k,mi[N],fac[N],inv[N],rev[N],a[N],b[N],c[N],A[N];
     7 int qpow(int n,int m){
     8     int s=n,ans=1;
     9     while (m){
    10         if (m&1)ans=(ll)ans*s%mod;
    11         s=(ll)s*s%mod,m>>=1;
    12     }
    13     return ans;
    14 }
    15 void ntt(int *a,int p=0){
    16     for(int i=0;i<N;i++)
    17         if (i<rev[i])swap(a[i],a[rev[i]]);
    18     for(int i=2;i<=N;i<<=1){
    19         int s=qpow(3,(mod-1)/i);
    20         if (p)s=qpow(s,mod-2);
    21         for(int j=0;j<N;j+=i){
    22             for(int k=0,ss=1;k<(i>>1);k++,ss=(ll)ss*s%mod){
    23                 int x=a[j+k],y=(ll)ss*a[j+k+(i>>1)]%mod;
    24                 a[j+k]=(x+y)%mod,a[j+k+(i>>1)]=(x-y+mod)%mod;                
    25             }
    26         }
    27     }
    28     if (p){
    29         int s=qpow(N,mod-2);
    30         for(int i=0;i<N;i++)a[i]=(ll)a[i]*s%mod;
    31     }
    32 }
    33 void mul(){
    34     ntt(a),ntt(b);
    35     for(int i=0;i<N;i++)c[i]=(ll)a[i]*b[i]%mod;
    36     ntt(c,1);
    37 }
    38 void calc(){
    39     memset(a,0,sizeof(a));
    40     memset(b,0,sizeof(b));
    41     for(int i=0;i<=n;i++){
    42         a[i]=(ll)A[i]*fac[i]%mod;
    43         b[i]=inv[n-i];
    44     }
    45     mul();
    46     for(int i=0;i<=n;i++)A[n-i]=(ll)mi[i]*inv[i]%mod*c[n+i]%mod;
    47     memset(a,0,sizeof(a));
    48     memset(b,0,sizeof(b));
    49     for(int i=0;i<=n;i++){
    50         a[i]=(ll)A[i]*fac[i]%mod;
    51         b[i]=inv[n-i];
    52         if ((n-i)&1)b[i]=mod-b[i];
    53     }
    54     mul();
    55     for(int i=0;i<=n;i++)A[i]=(ll)inv[i]*c[n+i]%mod;
    56 }
    57 int main(){
    58     mi[0]=fac[0]=inv[0]=inv[1]=1;
    59     for(int i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)+((i&1)*(N>>1));
    60     for(int i=1;i<N;i++)mi[i]=(mi[i-1]<<1)%mod;
    61     for(int i=1;i<N;i++)fac[i]=(ll)fac[i-1]*i%mod;
    62     for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
    63     for(int i=1;i<N;i++)inv[i]=(ll)inv[i-1]*inv[i]%mod;
    64     scanf("%d%d",&n,&k);
    65     for(int i=0;i<=n;i++)scanf("%d",&A[i]);
    66     calc();
    67     for(int i=0;i<=n;i++)A[i]=(ll)qpow((2*i-n+mod)%mod,k)*A[i]%mod;
    68     calc();
    69     int C=qpow((ll)1e9*qpow(n,k)%mod*mi[n]%mod,mod-2);
    70     for(int i=0;i<=n;i++)printf("%d ",(ll)C*A[i]%mod);
    71     return 0;
    72 } 
    View Code
  • 相关阅读:
    解决WPF中异常导致的程序Crash
    Python---pep8规范
    Python---13面向对象编程
    Python---12函数式编程------12.3匿名函数&装饰器&偏函数
    Python---12函数式编程------12.2返回函数
    Python中*args和**kwargs的区别
    测试干货-接口测试(接口测试工具+接口测试用例)
    Python---13靠谱的Pycharm安装详细教程
    Python---12函数式编程------12.1高阶函数
    Python---11模块
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/15849680.html
Copyright © 2020-2023  润新知