• BZOJ3516 国王奇遇记加强版


    题目

    [sum_{i=1}^ni^mm^i ]

    (nleq 10^9,mleq 10^3)

    看起来是个暴力好题,考虑倍增暴力搞,即从(sum_{i=1}^ni^mm^i)推到(sum_{i=1}^{2n}i^mm^i)

    [sum_{i=1}^{2n}i^mm^i=sum_{i=1}^ni^mm^i+m^nsum_{i=1}^n(i+n)^{m}m^{i} ]

    这个(sum_{i=1}^n(i+n)^{m}m^{i})二项式定理一下,就是(sum_{i=1}^nm^isum_{k=0}^minom{m}{k}i^kn^{m-k})

    交换一下(sum),并拆开组合数,就是

    [m!sum_{k=0}^mfrac{n^{m-k}}{(m-k)!} imes frac{sum_{i=1}^ni^km^i}{k!} ]

    显然是一个卷积的形式,暴力做就是(O(m^2log n))的,可以优化到(O(mlog mlog n))但不是NTT模数就算了吧

    还有这题怎么1s时限啊,好像只有在DB上能勉强跑过去

    代码

    #include<bits/stdc++.h>
    #define re register
    const int mod=1e9+7;
    inline int dqm(int x) {return x<0?x+mod:x;}
    inline int qm(int x) {return x>=mod?x-mod:x;}
    inline int ksm(int a,int b) {
        int S=1;for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)S=1ll*S*a%mod;return S;
    }
    int n,m,fac[1005],ifac[1005],ans[1005],g[1005],h[1005];
    void solve(int n,int *f) {
        if(n==1) {for(re int i=0;i<=m;i++) f[i]=m;return;}
        solve(n>>1,f);int k=n;k>>=1;
        for(re int i=0;i<=m;i++) g[i]=f[i];
        for(re int i=0;i<=m;i++) g[i]=1ll*g[i]*ifac[i]%mod;
        for(re int nw=1,i=0;i<=m;i++,nw=1ll*nw*k%mod) h[i]=1ll*ifac[i]*nw%mod;
        for(re int t=0,i=m;i>=0;g[i]=t,--i,t=0) 
            for(re int j=0;j<=i;j++) t=qm(t+1ll*g[i-j]*h[j]%mod);
        for(re int i=0;i<=m;i++) g[i]=1ll*g[i]*fac[i]%mod;
        for(re int t=ksm(m,k),i=0;i<=m;i++) f[i]=qm(f[i]+1ll*g[i]*t%mod);
        if(!(n&1)) return;int t=ksm(m,n);
        for(re int nw=1,i=0;i<=m;i++,nw=1ll*nw*n%mod) f[i]=qm(f[i]+1ll*t*nw%mod);
    }
    int main() {
        scanf("%d%d",&n,&m);ifac[0]=fac[0]=1;
        for(re int i=1;i<=m;i++) fac[i]=1ll*fac[i-1]*i%mod;
        ifac[m]=ksm(fac[m],mod-2);
        for(re int i=m-1;i;--i) ifac[i]=1ll*ifac[i+1]*(i+1)%mod;
        solve(n,ans);printf("%d
    ",ans[m]);return 0;
    }
    

    之后(O(m^2))蛮经典的,可以用我曾经瞎搞的一个方法来搞

    (f(k)=sum_{i=1}^ni^km^i)

    [egin{aligned} (1-m)f(k)&=sum_{i=1}^ni^km^i-sum_{i=1}^ni^km^{i+1}\ &=sum_{i=1}^ni^km^i-sum_{i=1}^{n+1}(i-1)^km^i\ &=-n^km^{n+1}+sum_{i=1}^n(i^k-(i-1)^k)m^i\ &=-n^km^{n+1}+sum_{i=1}^n(i^k-sum_{j=0}^kinom{k}{j}i^j(-1)^{k-j})m^i\ &=-n^km^{n+1}-sum_{i=1}^nm^isum_{j=0}^{k-1}inom{k}{j}i^j(-1)^{k-j}\ &=-n^km^{n+1}-k!sum_{j=0}^{k-1}frac{(-1)^{k-j}}{(k-j)!} imes frac{sum_{i=1}^ni^jm^i}{j!}\ &=-n^km^{n+1}-k!sum_{j=0}^{k-1}frac{(-1)^{k-j}}{(k-j)!} imes frac{f(j)}{j!} end{aligned} ]

    (O(m))做法不会了,告辞

  • 相关阅读:
    Java——字符串操作
    算法——Java实现队列
    算法——Java实现栈
    算法——线性表之链式存储结构
    算法——线性表之顺序存储结构
    Java——单双引号的区别
    Hystrix源码解析
    Eureka源码探索(一)-客户端服务端的启动和负载均衡
    dubbo源码研究(一)
    dubbo-springboot入门级demo
  • 原文地址:https://www.cnblogs.com/asuldb/p/12116329.html
Copyright © 2020-2023  润新知