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);
        }
    }
  • 相关阅读:
    函数--第一类对象、闭包、
    递归
    局部变量 和 全局变量
    默认参数,不固定参数 *args,**kwargs
    函数基本语法及特性
    文件修改
    文件操作,重点,日常使用!!!
    集合
    重新写了一边三级菜单,加了一些自己的理解
    三级菜单
  • 原文地址:https://www.cnblogs.com/rrsb/p/8797654.html
Copyright © 2011-2022 走看看