Méthode d'analyse des données ----- Méthode d'interpolation lagrangienne

En analyse numérique , l'interpolation de Lagrange est une méthode d'interpolation polynomiale nommée d'après le mathématicien français du XVIIIe siècle Joseph Lagrange . Dans de nombreux problèmes pratiques, les fonctions sont utilisées pour exprimer certaines connexions ou lois internes, et de nombreuses fonctions ne peuvent être comprises que par des expériences et des observations. Par exemple, si une certaine quantité physique est observée dans la pratique et que les valeurs observées correspondantes sont obtenues à plusieurs endroits différents, la méthode d'interpolation lagrangienne peut trouver un polynôme , qui prend juste la valeur observée à chaque point observé. De tels polynômes sont appelés polynômes lagrangiens (d'interpolation). Mathématiquement parlant, la méthode d'interpolation de Lagrange peut donner une fonction polynomiale qui passe par plusieurs points connus sur un plan à deux dimensions. L'interpolation lagrangienne a été découverte pour la première fois par le mathématicien anglais Edward Waring en 1779 et redécouverte peu de temps après (1783) par Leonhard Euler . En 1795, Lagrange a publié cette méthode d'interpolation dans son livre "Cours de base de mathématiques pour les écoles normales", et son nom a été associé à cette méthode depuis lors.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=9999991;
ll a[1010],sum[1010],fact[1010],pre[1010],suff[1010],finv[1010];
ll quickpow(ll a,ll b)
{
    ll res=1;
	while(b)
	{
		if(b&1)
		res=(res*a)%mod;
		b>>=1;
		a=(a*a)%mod; 
	}
	return res%mod;
}
void init()
{
	fact[0]=1;
	int i,j,k;
	for(i=1;i<1010;i++)
	{
		fact[i]=fact[i-1]*i%mod;
	}	
	finv[1009]=quickpow(fact[1009],mod-2);
	for(i=1008;i>=0;i--)
	{
		finv[i]=finv[i+1]*(i+1)%mod;
	}
}
ll solve(ll hh[],ll n,ll x)
{
	if(x<=n)
	return hh[x];
	int i,j,k;
	pre[0]=1,suff[n]=1;
	   int ans=0;
    for(int i=1;i<=n;i++)
        pre[i]=ll(pre[i-1]*(x-(i-1)))%mod;
    for(int i=n-1;i>=0;i--)
        suff[i]=ll(suff[i+1]*(x-(i+1)))%mod;
    for(int i=0;i<=n;i++)
	{
        int fuhao=(n-i)&1?-1:1;
        ans+=hh[i]%mod*fuhao*pre[i]%mod*suff[i]%mod*finv[i]%mod*finv[n-i]%mod;
        ans=(ans%mod+mod)%mod;
    }
    return ans;
}
int main()
{
	init();
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n,m,i,j;
		scanf("%d %d",&n,&m);
		for(i=0;i<=n;i++)
		{
			scanf("%d",&a[i]);
		}
		a[n+1]=solve(a,n,n+1);
		sum[0]=a[0];
		for(i=1;i<=n+1;i++)
		{
			sum[i]=(sum[i-1]+a[i])%mod;
		}
		while(m--)
		{
			int left,right;
			scanf("%d %d",&left,&right);
			ll ans=(solve(sum,n+1,right)-solve(sum,n+1,left-1));
			ans=(ans%mod+mod)%mod;
			printf("%lld\n",ans);
		}
	}
	return 0;
} 

les références:

Interpolation lagrangienne - Wikipédia

Application de l'interpolation de Lagrange (ACM, 2019 Nanchang Invitational Question B)_hash[072]'s blog-CSDN Blog

Camp d'entraînement multi-écoles ACM d'été Niuke.com (première session) F Somme du maximum (mathématiques combinatoires, interpolation de Lagrange)_czdb's blog-CSDN blog

Je suppose que tu aimes

Origine blog.csdn.net/qq_41050642/article/details/128297693
conseillé
Classement