zoukankan      html  css  js  c++  java
  • 拉格朗日插值。

    考虑到:
    (f(x)equiv f(a)(mod(x- a)))
    这样我们就可以列出关于(f(x))的多项式线性同余方程组。
    ( left{ egin{aligned} &f(x)equiv y_1(mod(x- x_1))\ &f(x)equiv y_2(mod(x- x_2))\ &....\ &f(x)equiv y_n(mod(x- x_n)) end{aligned} ight. )

    我们根据中国剩余定理,有:
    (M = prod_{i = 1}^n (x-x_i),m_i = frac{M}{x - x_i} = prod_{j eq i}(x_i - x_j))
    (m_i)((x - x_i))的逆元为:
    (m_i^{-1} = prod_{j eq i}frac{1}{x_i - x_j})
    所以有:
    (f(x) equiv sum_{i = 1}^n y_i m_i m_i^{-1} equiv sum_{i = 1} ^ n y_i prod_{j eq i} frac{x - x_j}{x_i - x_j} (mod M))

    所以在膜意义下,(f(x))是唯一的。

    这样可以在(O(n^2))时间内求出多项式。

    #include<iostream>
    #include<cstdio>
    #define ll long long 
    #define N 2020
    #define mod 998244353
    
    ll n,k,x[N],y[N],ans,s1,s2;
    
    inline ll pow(ll a,ll b){
    	ll ans = 1;
    	while(b){
    		if(b & 1)ans = ans * a % mod;
    		a = a * a % mod;
    		b >>= 1;
    	}
    	return ans;
    }
    
    int main(){
    	scanf("%lld%lld",&n,&k);
    	for(int i = 1;i <= n;++i)
    	scanf("%lld%lld",&x[i],&y[i]);
    	for(int i = 1;i <= n;++i){
    		s1 = y[i] % mod;
    		s2 = 1ll;
    		for(int j = 1;j <= n;++j)
    		if(i != j)s1 = (s1 * (k - x[j] + mod) % mod) % mod,s2 = (s2 * (x[i] - x[j] + mod) % mod) % mod;
    		ans = (ans + s1 * pow(s2,mod - 2) % mod + mod) % mod;
    	}
    	std::cout<<((ans + mod) % mod)<<std::endl;
    }
    
  • 相关阅读:
    jQuery的动画以及扩展功能
    yii2 redirect重定向
    nvaicat mysql ssh 跳板机(堡垒机???)连接服务器
    Linux下Redis的安装
    深入理解PHP的运行模式
    thinkphp5 如何监听sql?
    thinkphp5 如何使用查询事件?
    layui laydate is not defined
    CSS 实现图片灰度效果 兼容各种浏览器
    PHP基础学习----函数
  • 原文地址:https://www.cnblogs.com/dixiao/p/15159096.html
Copyright © 2011-2022 走看看