zoukankan      html  css  js  c++  java
  • luogu4781

    题目描述

    由小学知识可知 n 个点 (x_i,y_i) 可以唯一地确定一个多项式 y = f(x)

    现在,给定这 n 个点,请你确定这个多项式,并求出f(k)mod998244353 的值。

    输入格式

    第一行两个整数 n,k

    接下来 n 行,第 i 行两个整数 x_i,y_i

    输出格式

    一行一个整数,表示 f(k)mod998244353 的值。

    输入输出样例

    输入 #1
    3 100
    1 4
    2 9
    3 16
    输出 #1
    10201
    输入 #2
    3 100
    1 1
    2 2
    3 3
    输出 #2
    100

    说明/提示

    样例一中的多项式为 f(x)=x^2+2x+1f(100) = 10201

    样例二中的多项式为 f(x)=xf(100) = 100


    1n2×103,1xi,yi,k<998244353,x_i两两不同。

    __________________________________________________

    拉格朗日插值

    给定n+1个点(x_0,y_0),(x_1,y_1),...,(x_n,y_n)

    确定a_1*x^n+a_2*x^(n-1)+a_3*x^(n-2)+...+a_(n+1)*x^0

    实际就是把n个点代入,解出n+1个系数。

    再给你一个x求出对应的y值。

    但是这个方法太慢,于是可以用拉格朗日插值法构造出这个函数,并解出y的值。

    方法如下:

    根据(x_0,y_0)我们可以构建一个函数,当x=x_0时,y=y_0;而代入x=x_1,x_2,...,x_n时y=0

    y=y_0*((x-x_1)(x-x_2)(x-x_3)...(x-x_n))/((x_0-x_1)(x_0-x_2)(x_0-x_3)...(x_0-x_n))

    同样的方法,我们可以其它点构造出对应的函数。

    y=y_1*((x-x_0)(x-x_2)(x-x_3)...(x-x_n))/((x_1-x_0)(x_1-x_2)(x_1-x_3)...(x_1-x_n))

    y=y_2*((x-x_0)(x-x_1)(x-x_3)...(x-x_n))/((x_2-x_0)(x_2-x_1)(x_2-x_3)...(x_2-x_n))

    ...

    y=y_n*((x-x_0)(x-x_1)(x-x_2)...(x-x_n-1))/((x_n-x_0)(x_n-x_1)(x_n-x_2)...(x_n-x_n-1))

    然后把它们加起来就是我们要的函数

    y=sum_{i=0}^n y_i * prod _{i=0,i eq j}^n (x-x_j)/(x_i-x_j)

    这样就可以用O(N^2)完成

    __________________________________________________

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=2010;
     4 const int mod=998244353;
     5 int n;
     6 int x[maxn],y[maxn],xx;
     7 int qpow(int x,int p)
     8 {
     9     if(p==0)return 1;
    10     int tp=qpow(x,p/2);
    11     tp=1ll*tp*tp%mod;
    12     if(p%2)tp=1ll*tp*x%mod;
    13     return tp;
    14 }
    15 int lagrange(int n,int *x,int *y,int xi)
    16 {
    17     int ans=0;
    18     for(int i=1;i<=n;++i)
    19     {
    20         int fz=1,fm=1;
    21         for(int j=1;j<=n;++j)
    22         {
    23             if(i==j)continue;
    24             fz=1ll*fz*(xi-x[j])%mod;
    25             fm=1ll*fm*(x[i]-x[j])%mod;
    26         }
    27         ans=(1ll*ans+1ll*y[i]*fz%mod*qpow(fm,mod-2)%mod)%mod;
    28     }
    29     return (ans+mod)%mod;
    30 }
    31 
    32 int main()
    33 {
    34     scanf("%d%d",&n,&xx);
    35     for(int i=1;i<=n;++i)scanf("%d%d",&x[i],&y[i]);
    36     cout<<lagrange(n,x,y,xx)<<endl;
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    Jzoj4822 完美标号
    Jzoj4822 完美标号
    Jzoj4792 整除
    Jzoj4792 整除
    Educational Codeforces Round 79 A. New Year Garland
    Good Bye 2019 C. Make Good
    ?Good Bye 2019 B. Interesting Subarray
    Good Bye 2019 A. Card Game
    力扣算法题—088扰乱字符串【二叉树】
    力扣算法题—086分隔链表
  • 原文地址:https://www.cnblogs.com/gryzy/p/14994956.html
Copyright © 2011-2022 走看看