zoukankan      html  css  js  c++  java
  • 【模板】 拉格朗日插值

    由n + 1 个点可以确定一个n次多项式。

    拉格朗日插值法可以在 n^2 复杂度确定一个多项式并进行求解。

    模板 ;

    给定n 个点,以及k ,求出确定的多项式的 f(k)。

    #pragma warning(disable:4996)
    
    #include<iostream>
    #include<algorithm>
    //#include<bitset>
    //#/include<tuple>
    //#include<unordered_map>
    #include<fstream>
    #include<iomanip>
    #include<string>
    #include<cmath>
    #include<cstring>
    #include<vector>
    #include<map>
    #include<set>
    #include<list>
    #include<queue>
    #include<stack>
    #include<sstream>
    #include<cstdio>
    #include<ctime>
    #include<cstdlib>
    #include <assert.h>
    #define pb push_back
    #define INF 0x3F3F3F3F
    #define inf 998244353
    #define moD 1000000003
    #define pii pair<int,int>
    #define eps 1e-6
    #define equals(a,b) (fabs(a-b)<eps)
    #define bug puts("bug")
    #define re  register
    #define fi first
    #define se second
    typedef  long long ll;
    typedef unsigned long long ull;
    const ll MOD = 998244353;
    const ll Mod = 998244352;
    const int maxn = 2e5 + 5;
    const double Inf = 10000.0;
    const double PI = acos(-1.0);
    using namespace std;
    
    ll mul(ll a, ll b, ll m) {
        ll res = 0;
        while (b) {
            if (b & 1) res = (res + a) % m;
            a = (a + a) % m;
            b >>= 1;
        }
        return res % m;
    }
        
    ll quickPower(ll a, ll b, ll m) {
        ll base = a;
        ll ans = 1ll;
        while (b) {
            if (b & 1) ans = mul(ans, base, m);
            base = mul(base, base, m);
            b >>= 1;
        }
        return ans;
    }
    
    ll ksm(ll a, ll b, ll m) {
        ll base = a;
        ll ans = 1ll;
        while (b) {
            if (b & 1) ans *= base, ans %= m;
            base *= base, base %= m;
            b >>= 1;
        }
        return ans;
    }
    
    
    
    ll gcd(ll a, ll b) {
        return b == 0 ? a : gcd(b, a % b);
    }
    
    ll Lcm(ll a, ll b) {
        return a / gcd(a, b) * b;
    }
    
    int readint() {
        int x = 0, f = 1; char ch = getchar();
        while (ch < '0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
        while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
        return x * f;
    }
    
    ll readll() {
        ll x = 0, f = 1; char ch = getchar();
        while (ch < '0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
        while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
        return x * f;
    }
    
    ull readull() {
        ull x = 0, f = 1; char ch = getchar();
        while (ch < '0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
        while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
        return x * f;
    }
    
    void Put(ll x) {
        if (x < 0) putchar('-'), x *= -1;
        if (x > 9) Put(x / 10);
        putchar(x % 10 + '0');
    }
    
    ll x[2005];
    ll y[2005];
    
    
    int main() {
        int n = readint();
        ll k = readll();
        ll res = 0;
        for (int i = 0; i < n; i++) x[i] = readll(), y[i] = readll();
        for (int i = 0; i < n; i++) {
            ll tmp1 = 1ll;
            ll tmp2 = 1ll;
            for (int j = 0; j < n; j++) {
                if (i == j) continue;
                tmp1 = tmp1 * (k - x[j]) % MOD;
                tmp2 = (tmp2 * (((x[i] - x[j]) + MOD) % MOD)) % MOD;
            }
            res = res + y[i] * tmp1 % MOD * ksm(tmp2, MOD - 2, MOD) % MOD;
            res = (res + MOD) % MOD;
        }
        Put(res);
    }
  • 相关阅读:
    [AH2017/HNOI2017]礼物
    [八省联考2018]林克卡特树lct
    [洛谷P4847]银河英雄传说V2
    [洛谷P4999]烦人的数学作业
    [洛谷P4171][JSOI2010]满汉全席
    [CF785E]Anton and Permutation
    [洛谷P2511][HAOI2008]木棍分割
    [洛谷P4430]小猴打架
    [UVA307]小木棍 Sticks
    [LOJ #6433]「PKUSC2018」最大前缀和
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13471525.html
Copyright © 2011-2022 走看看