zoukankan      html  css  js  c++  java
  • [TJOI2018]教科书般的亵渎

    VIII.[TJOI2018]教科书般的亵渎

    这题主要是介绍拉格朗日插值模板那题中,我们提到的“求出\(f(x)\)的多项式表达”的做法。

    首先,这题显然如果我们令\(f(x)=\sum\limits_{i=0}^{x}i^{m+1}\),且\(a_{m+1}=n+1\)的话,答案就是

    \[\sum\limits_{i=1}^{m+1}\sum\limits_{j=0}^{i-1}f(a_i-1-a_j)-f(a_{i-1}-a_j) \]

    这是由题意可以直接得出的。

    于是我们现在重点就在于如何求出\(f(x)\),即\(\sum\limits_{i=0}^{x}i^{m+1}\)

    经验告诉我们,这是一个\(m+2\)次多项式。于是我们就随便找\(m+2\)个点带进去插值一下就能求出这个多项式的系数表达。

    当然,这题的瓶颈不在于\(f(x)\)的求法,而在于答案那个式子,你无论如何都需要\(O(n^3)\)秦九韶代入求值,故总复杂度\(O(n^3)\)。这也意味着你可以图方便直接\(O(n^3)\)高斯消元消出多项式系数出来。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int mod=1e9+7;
    int T,m,b[100],c[100],d[100],e[100],res;
    ll n,a[100];
    int ksm(int x,int y){
    	int z=1;
    	for(;y;y>>=1,x=1ll*x*x%mod)if(y&1)z=1ll*z*x%mod;
    	return z;
    }
    void mul(int x){
    	for(int i=m+2;i>=0;i--){
    		b[i]=1ll*b[i]*x%mod;
    		if(i)(b[i]+=b[i-1])%=mod;
    	}
    }
    void div(int x){
    	for(int i=0;i<=m+2;i++)c[i]=b[i];
    	for(int i=m+2;i;i--)c[i-1]=(c[i-1]-1ll*c[i]*x%mod+mod)%mod;
    	for(int i=0;i<=m+1;i++)c[i]=c[i+1];
    }
    int func(ll x){
    	((x%=mod)+=mod)%=mod;
    	int ret=0;
    	for(int i=m+1;i>=0;i--)ret=(1ll*ret*x+d[i])%mod;
    	return ret;
    }
    int main(){
    	scanf("%d",&T);
    	while(T--){
    		scanf("%lld%d",&n,&m),m++,res=0;
    		for(int i=1;i<m;i++)scanf("%lld",&a[i]);
    		sort(a+1,a+m);
    		b[0]=1;for(int i=1;i<=m+2;i++)b[i]=0;
    		for(int i=0;i<=m+1;i++)d[i]=0;
    		for(int i=0;i<=m+1;i++)e[i]=ksm(i,m),mul((mod-i)%mod);
    		for(int i=1;i<=m+1;i++)(e[i]+=e[i-1])%=mod;
    		for(int i=0;i<=m+1;i++){
    			div((mod-i)%mod);
    			int delta=e[i];
    			for(int j=0;j<=m+1;j++)if(i!=j)delta=1ll*delta*ksm((i-j+mod)%mod,mod-2)%mod;
    			for(int j=0;j<=m+1;j++)c[j]=1ll*c[j]*delta%mod;
    			for(int j=0;j<=m+1;j++)(d[j]+=c[j])%=mod;
    		}
    		a[m]=n+1;
    		for(int i=1;i<=m;i++)for(int j=0;j<i;j++)(res+=(func(a[i]-a[j]-1)-func(a[i-1]-a[j])+mod)%mod)%=mod;
    		printf("%d\n",res);
    	}
    	return 0;
    } 
    

  • 相关阅读:
    0916 编程实验一 词法分析程序 总结
    0916 编程实验一 词法分析程序
    0909编译
    C语言文法
    词法分析编译感想
    词法分析
    0909 编译原理
    0429团队3.0
    0428 团队项目合作2.0作业
    0422 数学口袋精灵app
  • 原文地址:https://www.cnblogs.com/Troverld/p/14607890.html
Copyright © 2011-2022 走看看