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);
    }
  • 相关阅读:
    Object-C,NSSet,不可变集合
    NYIST 860 又见01背包
    NYIST 1070 诡异的电梯【Ⅰ】
    HDU 1542 Atlantis
    HDU 4756 Install Air Conditioning
    CodeForces 362E Petya and Pipes
    HDU 4751 Divide Groups
    HDU 3081 Marriage Match II
    UVA 11404 Palindromic Subsequence
    UVALIVE 4256 Salesmen
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13471525.html
Copyright © 2011-2022 走看看