#pragma once
/**
* Author: Teetat T.
* Description: Lagrange interpolation. Given f(0)...f(n) return a polynomial with degree n.
* Time: $O(N)$
*/template<classmint>mintlagrange_interpolate(vector<mint>&f,mintc){intn=f.size();if(c.val()<n)returnf[c.val()];vector<mint>l(n+1),r(n+1);l[0]=r[n]=1;for(inti=0;i<n;i++)l[i+1]=l[i]*(c-i);for(inti=n-1;i>=0;i--)r[i]=r[i+1]*(c-i);mintans=0;for(inti=0;i<n;i++){mintcur=f[i]*comb.ifac(i)*comb.ifac(n-i-1);if((n-i-1)&1)cur*=-1;ans+=cur*l[i]*r[i+1];}returnans;}
#line 2 "src/polynomials/lagrange-interpolate.hpp"
/**
* Author: Teetat T.
* Description: Lagrange interpolation. Given f(0)...f(n) return a polynomial with degree n.
* Time: $O(N)$
*/template<classmint>mintlagrange_interpolate(vector<mint>&f,mintc){intn=f.size();if(c.val()<n)returnf[c.val()];vector<mint>l(n+1),r(n+1);l[0]=r[n]=1;for(inti=0;i<n;i++)l[i+1]=l[i]*(c-i);for(inti=n-1;i>=0;i--)r[i]=r[i+1]*(c-i);mintans=0;for(inti=0;i<n;i++){mintcur=f[i]*comb.ifac(i)*comb.ifac(n-i-1);if((n-i-1)&1)cur*=-1;ans+=cur*l[i]*r[i+1];}returnans;}