zoukankan      html  css  js  c++  java
  • 51nod 1258 序列求和

    SOL:

       拉格朗日插值啊。复杂度是O(nlogn)的。

       but此题卡常数,只能套一个快速幂。还有一个要预处理掉。

      

    #pragma GCC optimize("-O2")
    #include<bits/stdc++.h>
    #define LL long long
    #define mo 1000000007
    #define N 50007
    int t;
    LL n,k,ni[N],fi[N],anw[N],anp,ppp,ans,p[N],q[N];
    inline LL qsm(LL x,LL y=mo-2){
        static LL anw;
        for (anw=1;y;y>>=1,x=x*x%mo) if (y&1) anw=anw*x%mo; return anw;
    }
    using namespace std;
    signed main() {
    //    freopen("aa.in","r",stdin);
    //    freopen("a.out","w",stdout);
        scanf("%d",&t);
        fi[0]=1;
        for (int i=1;i<N;i++) fi[i]=fi[i-1]*i%mo; ni[N-1]=qsm(fi[N-1]);
        for (int i=N-1;i;i--) ni[i-1]=ni[i]*i%mo;
        while (t--) {
            scanf("%lld%lld",&n,&k);
            n%=mo;
            anp=1;
            for (int i=1;i<=k+2;i++) 
                anw[i]=(anw[i-1]+qsm(i,k))%mo,anp=anp*(n-i)%mo;
            if (n<=k+2) {
                printf("%lld
    ",anw[n]);
                continue;
            }
            anp=(anp+mo)%mo;
            p[0]=q[k+3]=1;
            for (int i=1;i<=k+2;i++) p[i]=p[i-1]*(n-i)%mo;
            for (int i=k+2;i>=1;i--) q[i]=q[i+1]*(n-i)%mo;
            ans=0;
            for (int i=1;i<=k+2;i++)  {
             ppp=p[i-1]*q[i+1]%mo*ni[k+2-i]%mo*ni[i-1]%mo;
             if (((i&1))^((k&1))) ppp=mo-ppp;
             ans=(ans+ppp*anw[i])%mo; }
            printf("%lld
    ",ans);
        }
    }
  • 相关阅读:
    hdu 3791 二叉搜索树
    hdu 4041 Eliminate Witches! 栈和队列
    后缀数组讲解
    Theme Section HDU
    Wow! Such Doge! HDU
    Girls' research HDU
    吉哥系列故事――完美队形II HDU
    Best Reward HDU
    String Problem HDU
    最大最小表示法
  • 原文地址:https://www.cnblogs.com/rrsb/p/8797654.html
Copyright © 2011-2022 走看看