• 【BZOJ5339】【洛谷P4593】【TJOI2018】—教科书般的亵渎(拉格朗日插值)


    传送门

    题意很不清晰明确
    建议手玩或者找篇有解释的题解


    其实大致就是要多次求i=1aiki=1naiksum_{i=1}^{a}{i^k}-sum_{i=1}^{n}a_i^k这样的东西
    可以发现我们一共要做m+1m+1次亵渎
    实际上只用考虑怎么求i=1nim+1sum_{i=1}^{n}i^{m+1}
    把柿子变一下得i=1n(ni)m+1sum_{i=1}^{n}(n-i)^{m+1}
    网上说 可以得到这是一个关于nnm+2m+2次多项式
    由于有nn项,所以多一次

    于是可以插m+2m+2个值就完了
    11~m+2m+2可以做到O(m3)O(m^3)

    注意读入可能会爆long longlong long
    还有正负号

    #include<bits/stdc++.h>
    using namespace std;
    const int RLEN=1<<21|1;
    inline char gc(){
        static char ibuf[RLEN],*ib,*ob;
        (ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
        return (ib==ob)?EOF:*ib++;
    } 
    #define gc getchar
    #define int long long
    inline int read(){
        char ch=gc();
        int res=0,f=1;
        while(!isdigit(ch))f^=ch=='-',ch=gc();
        while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
        return f?res:-res;
    }
    #define ll long long
    #define pii pair<int,int>
    #define fi first
    #define se second
    #define pb push_back
    #define pob pop_back
    #define pf push_front
    #define pof pop_front
    #define mp make_pair
    #define bg begin
    #define re register
    const int mod=1e9+7,g=3;
    inline int add(int a,int b){return a+b>=mod?(a+b)%mod:a+b;}
    inline void Add(int &a,int b){a=add(a,b);}
    inline int dec(int a,int b){return a>=b?a-b:(a-b)%mod+mod;}
    inline void Dec(int &a,int b){a=dec(a,b);}
    inline int mul(int a,int b){return (a%mod*b%mod)%mod;}
    inline void Mul(int &a,int b){a=mul(a,b);}
    inline int ksm(int a,int b,int res=1){for(;b;b>>=1,Mul(a,a))(b&1)&&(Mul(res,a),1);return res;}
    inline void chemx(int &a,int b){a>b?0:a=b;}
    inline void chemn(int &a,int b){a<b?a=b:0;}
    const int N=55;
    int n,m,fac[N],a[N];
    inline int calc(int n,int m){
        int res=0;
        if(n<=m+2){
            for(int i=1;i<=n;i++)Add(res,ksm(i,m));return res;
        }
        int y=0;
        for(int i=1;i<=m+2;i++){
            Add(y,ksm(i,m));
            int k=mul(mul(dec(n%mod,i),fac[i-1]),fac[m+2-i]);
            if((m+2-i)&1)Mul(k,dec(0,1));
            k=ksm(k,mod-2);
            Add(res,mul(k,y));
        }
        for(int i=1;i<=m+2;i++)
        Mul(res,dec(n%mod,i));
        return res;
    }
    signed main(){
        int T=read();fac[0]=1;
        for(int i=1;i<=54;i++)fac[i]=mul(fac[i-1],i);
        while(T--){
            n=read(),m=read();
            for(int i=1;i<=m;i++)a[i]=read();
            sort(a+1,a+m+1);int res=0;
            for(int i=0;i<=m;i++){
                Add(res,calc(n-a[i],m+1));
                for(int j=i+1;j<=m;j++)
                    Dec(res,ksm(dec(a[j],a[i]),m+1));
            }cout<<res%mod<<'
    ';
        }
    }
    
  • 相关阅读:
    剑指offer(第2版)刷题 Python版汇总
    git学习笔记
    Python中的lambda、map和filter
    算法题 22 折纸问题 (牛客网,今日头条)
    算法题 21 findNSum (好未来,LeetCode,牛客网)
    算法题 20 或与加
    Python的内存管理机制
    【算法题12 解码方法decode way】
    理解循环神经网络的来龙去脉
    机器学习资源个人汇总
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/11145533.html
Copyright © 2020-2023  润新知