zoukankan      html  css  js  c++  java
  • uoj#269. 【清华集训2016】如何优雅地求和(数论)

    传送门

    首先,如果(f(x)=1),那么根据二项式定理,有(Q(f,n,k)=1)

    (f(x)=x)的时候,有$$Q=sum_{i=0}^ni imes frac{n!}{i!(n-i)!}k^i(1-k)^{n-i}$$

    [Q=sum_{i=0}^nnk imes frac{(n-1)!}{(i-1)!(n-i)!}k^{i-1}(1-k)^{n-i} ]

    [Q=nksum_{i=0}^nfrac{(n-1)!}{(i-1)!(n-i)!}k^{i-1}(1-k)^{n-i} ]

    [Q=nksum_{i=0}^n{n-1choose i-1}k^{i-1}(1-k)^{n-i} ]

    根据二项式定理后面的等于(1),所以(Q=nk)

    然后我们发现,如果(f(x)=x^{underline{d}}),则有(Q=n^{underline{d}}k^d),其中(x^{underline{d}})(x)(d)次下降幂,为(x(x-1)...(x-d+1)),证明和上面的差不多当

    [Q=sum_{i=0}^ni^{underline{d}} imes frac{n!}{i!(n-i)!}k^i(1-k)^{n-i} ]

    [Q=sum_{i=0}^nn^{underline{d}}x^d imes frac{(n-d)!}{(i-d)!(n-i)!}k^{i-d}(1-k)^{n-i} ]

    [Q=n^{underline{d}}k^dsum_{i=0}^n frac{(n-d)!}{(i-d)!(n-i)!}k^{i-d}(1-k)^{n-i} ]

    [Q=n^{underline{d}}k^dsum_{i=0}^n{n-dchoose i-d}k^{i-d}(1-k)^{n-i} ]

    后面那个还是等于(1)

    根据乘法分配律,如果(f(x)=sum_{i=0}^m a_ix^{underline{i}}),那么(Q(f,n,x)=sum_{i=0}^m a_i imes Q(x^{underline{i}},n,k))

    考虑如何计算(a_i),记(b_i=frac{a_i}{i!}),那么(f(x)=sum_{i=0}^m b_ifrac{x^{underline{i}}}{i!}=sum_{i=0}^m b_i{xchoose i})

    不要忘了我们已知(x=0,1,...,m)(f(x))的值

    (x=0)时,(f(x)=b_0)

    ( riangle f(x)=f(x+1)-f(x)),即一阶差分,因为({x+1choose i}-{xchoose i}={xchoose i-1}),所有( riangle f(x)=sum_{i=1}^m b_i{xchoose i-1}),那么( riangle f(0)=b_1)

    同理,( riangle^kf(0)=b_k),即(k)阶差分后(0)处的值为(b_k)

    因为std写的是(O(m^2))的我们不能辜负出题人的一片好心,所以直接(O(m^2))暴力就好了(据说这里可以用$FFT优化然而懒了233)

    然后没有然后了

    //minamoto
    #include<bits/stdc++.h>
    #define R register
    #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
    #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
    #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
    using namespace std;
    char buf[1<<21],*p1=buf,*p2=buf;
    inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
    int read(){
        R int res,f=1;R char ch;
        while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
        for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
        return res*f;
    }
    const int N=2e4+5,P=998244353;
    inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
    inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
    inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
    int ksm(R int x,R int y){
    	R int res=1;
    	for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
    	return res;
    }
    int b[N],n,m,k,ans,p=1;
    int main(){
    //	freopen("testdata.in","r",stdin);
    	n=read(),m=read(),k=read();
    	fp(i,0,m)b[i]=read();
    	fp(i,0,m){
    		ans=add(ans,mul(p,b[0]));
    		fp(j,0,m-i-1)b[j]=dec(b[j+1],b[j]);
    		p=1ll*p*k%P*(n-i)%P*ksm(i+1,P-2)%P;
    	}printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    尘误解
    了解了解你自己的话zookeeper(从那时起,纠正了一些说法在线)
    HDU 5055 Bob and math problem(结构体)
    Linux通过编辑器vi使用介绍
    OCP-1Z0-051-名称解析-文章32称号
    刘强东:解密京东10甘蔗理论
    Android结构分析Android智能指针(两)
    hbase ganglia监控配置
    第一个位和一个真正的项目件
    Html5 の 微信飞机大战
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/10237912.html
Copyright © 2011-2022 走看看