拉格朗日插值模板

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Game_Acm/article/details/82216311

拉格朗日根本公式:y=Σ(i=0->n-1)[yk*(j!=k)(x-xj)][(j!=k)(xj-xk)]

拉格朗日插值法求:Σ(i=1->n)ik

拉格朗日插值法公式:f(n)=Σ(i=1->k+2)(-1)k-i+2f(i)[Σ(j=1->k+2)(n-j)]/[(n-i)*(i-1)!*(k+2-i)!]

int f[maxn],fac[maxn]; 
int Qpow( int a , int b )
{
    int res = 1;
    while ( b )
    {
        if ( b&1 )
            res = 1LL*res*a%mod;
        a = 1LL*a*a%mod;
        b = b>>1;
    }
    return res;
}
void slove( int n , int k )
{
    for ( int i=1 ; i<=k+2 ; i++ )
        f[i] = (f[i-1]+Qpow(i,k))%mod;
    if ( n<=k+2 )
        printf ( "%d\n" , f[n] );
    else
    {
        fac[0] = 1;
        for ( int i=1 ; i<=k+2 ; i++ )
            fac[i] = 1LL*i*fac[i-1]%mod;
        int cur = 1,ans = 0;
        for ( int i=1 ; i<=k+2 ; i++ )
            cur = 1LL*cur*(n-i)%mod;
        for ( int i=1 ; i<=k+2 ; i++ )
        {
            int inv1 = Qpow( n-i , mod-2 );
            int inv2 = Qpow( 1LL*fac[i-1]*fac[k+2-i]%mod , mod-2 );
            int sign = (k+2-i)%2?-1:1;
            ans = (ans+1LL*sign*inv1*inv2%mod*f[i]%mod*cur%mod)%mod;
            ans = (ans+mod)%mod;
        }
        printf ( "%d\n" , ans );
    }
}

猜你喜欢

转载自blog.csdn.net/Game_Acm/article/details/82216311