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

    代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #define int long long
    
    using namespace std;
    
    const int N=3000,M=998244353;
    int n,k,x[N],y[N],a[N*N],inv[N*N],b[N*N];
    
    void init()
    {
    	scanf("%lld %lld",&n,&k);
    	for (int i=1;i<=n;i++)
    		scanf("%lld %lld",&x[i],&y[i]);
    }
    
    int ksm(int a,int b)
    {
    	int res=1;
    	while(b)
    	{
    		if(b&1)
    			res=1ll*res*a%M;
    		b>>=1,a=1ll*a*a%M;
    	}
    	return res;
    }
    
    void work()
    {
    	int cnt=0;
    	for (int i=1;i<=n;i++)
    		for (int j=1;j<=n;j++)
    		{
    			if(i==j) continue;
    			a[++cnt]=x[i]-x[j];
    		}
    //	printf("ksm:%lld",ksm(3,4));
    //	printf("cnt_%lld
    ",cnt);
    	a[0]=1;
    	for (int i=1;i<=cnt;i++)
    		b[i]=a[i],a[i]=a[i-1]*a[i]%M;
    	inv[cnt]=ksm(a[cnt],M-2);
    	for (int i=cnt-1;i>=0;i--)
    		inv[i]=1ll*inv[i+1]*b[i+1]%M;
    	cnt=0;
    	int ans=0;
    	for (int i=1;i<=n;i++)
    	{
    		int tmp=y[i];
    		for (int j=1;j<=n;j++)
    		{
    			if(i==j) continue;
    			tmp=1ll*tmp*(k-x[j])%M*(inv[++cnt]*a[cnt-1]%M)%M;
    		}
    		ans=(ans+tmp)%M;
    	}
    	printf("%lld
    ",(ans+M)%M);
    }
    
    signed main()
    {
    	init();
    	work();
    	return 0;
    }
    
    由于博主比较菜,所以有很多东西待学习,大部分文章会持续更新,另外如果有出错或者不周之处,欢迎大家在评论中指出!
  • 相关阅读:
    侧边框伸缩
    百度登录界面
    PHP 判断是否包含在某个字符串中
    三个等于号===和两个等于号==的区别
    PHP的魔法方法
    Apache和PHP环境配置
    群同构与线性空间同构的区别
    SciPy0.11.0(or higher)安装
    博客搬家
    简单的组件传值
  • 原文地址:https://www.cnblogs.com/With-penguin/p/13423837.html
Copyright © 2011-2022 走看看