zoukankan      html  css  js  c++  java
  • CF622F.The Sum of the k-th Powers(拉格朗日插值法i取连续值)

    CF传送门

    洛谷传送门

    解题思路

    首先,前半部分关于p阶等差数列的知识请看这篇博客
    总结一下就是:

    • 如果数列的p阶差数列是一个非0的常数数列,那么称它为p阶等差数列
    • 数列(a)为一个p阶等差数列的充要条件是数列的通项(a_n)为关于n的p次多项式

    然后这个题就可以推出是个关于n的k+1次多项式。(因为作差后为(1^k,2^k,3^k),为k次多项式,所以作差前是k+1次多项式)
    再根据拉格朗日插值法,我们取n=1~k+2,带入下面的拉格朗日插值法公式求解。

    i取连续值时的拉格朗日插值法

    仔细观察公式:

    [f(i)=sum_{i=1}^n y_iprod_{i e j}frac{(k-x_j)}{x_i-x_j} ]

    当i取连续值时,

    [prod_{i e j}(k-x_j) ]

    可拆成

    [prod_{j=1}^{i-1}(k-j) imesprod_{j=i+1}^{k+2}(k-j) ]

    可以通过前缀后缀积预处理得出。

    分母也可以拆成

    [prod_{j=1}^{i}j imesprod_{j=i-k-2}^{-1}j ]

    都可以预处理得出。
    最后(y_i)乘上分子再乘上分母的逆元即可。
    所以当i取连续值时,时间复杂度可以优化到O(klogk)。
    注意:最后一定要(ans+mod)%mod,不然可能是负数。

    AC代码

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<iomanip>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int mod=1e9+7;
    const int maxk=1000005;
    int n,k; 
    long long fenzi=1,res,ans;
    long long fenmu1[maxk],fenmu2[maxk];
    long long qp(long long a,long long b){
    	if(b==0) return 1;
    	if(b==1) return a;
    	long long ans=qp(a,b/2);
    	if(b&1) return ans*ans%mod*a%mod;
    	return ans*ans%mod;
    } 
    inline long long getinv(long long a){
    	return qp(a,mod-2);
    }
    int main(){
    	cin>>n>>k;
    	if(k+2>=n){
    		for(int i=1;i<=n;i++) ans=(ans+qp(i,k))%mod;
    		cout<<ans;
    		return 0;
    	}
    	fenmu1[1]=fenmu2[k+2]=1;
    	for(int i=1;i<=k+2;i++){
    		fenzi=fenzi*(n-i)%mod;
    		fenmu1[i+1]=fenmu1[i]*i%mod;
    	}
    	for(int i=k+1;i>=1;i--){
    		fenmu2[i]=fenmu2[i+1]*(i-k-2)%mod;
    	}
    	for(int i=1;i<=k+2;i++){
    		res=(res+qp(i,k))%mod;
    		ans=(ans+res*fenzi%mod*getinv(n-i)%mod*getinv(fenmu1[i]*fenmu2[i]%mod)%mod)%mod;
    	}
    	cout<<(ans+mod)%mod;
        return 0;
    }
    
  • 相关阅读:
    如何获取公网IP
    v语言初体验
    利用python实现修改阿里云DNS值解析
    谈谈 ansible handlers
    使用dockerfile,创建gitblit镜像
    再谈docker基本命令
    使用tcpdump探测TCP/IP三次握手
    利用python list 完成最简单的DB连接池
    nginx报错:./configure: error: C compiler cc is not found, gcc 是已经安装了的
    探寻TP-Link路由器的登录验证
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/14828565.html
Copyright © 2011-2022 走看看