#ifndef AFMT_LAGRANGE
#define AFMT_LAGRANGE
#include"comb.hpp"
#include<cassert>
#include<iostream>
#include<vector>template<classmint>inlinemintlagrange(std::vector<mint>x,std::vector<mint>y,mintk){mintans=0,cur;constintn=x.size();for(inti=0;i<n;i++){cur=y[i];for(intj=0;j<n;j++){if(j==i)continue;cur*=(k-x[j])/(x[i]-x[j]);}ans+=cur;}returnans;}// y[0] is placeholder.// If for all integer x_i in [1, n], we have f(x_i) = y_i (mod p), find f(k) mod p.template<classmint>inlinemintcont_lagrange(std::vector<mint>y,mintk){mintans=0;constintn=y.size()-1;Comb<mint>comb(n);std::vector<mint>pre(n+1,1),suf(n+2,1);for(inti=1;i<=n;i++)pre[i]=pre[i-1]*(k-i);for(inti=n;i>=1;i--)suf[i]=suf[i+1]*(k-i);for(inti=1;i<=n;i++){mintA=pre[i-1]*suf[i+1];mintB=comb.fac(i-1)*comb.fac(n-i);ans+=((n-i)&1?-1:1)*y[i]*A/B;}returnans;}// find 1^k + 2^k + ... + n^k. in O(k log k) of time complexity.template<classmint>inlinemintsum_of_kth_powers(mintn,intk){mintsum=0;std::vector<mint>Y{0};for(inti=1;i<=k+2;i++){Y.push_back(sum+=(mint)i^k);}returncont_lagrange(Y,n);}template<classmint>std::vector<mint>find_coefficient(std::vector<mint>x,std::vector<mint>y){// F(k) = \prod (k - x_i): n degree, n + 1 coefficients.intn=x.size(),i;std::vector<mint>F(n+1);assert(n==(int)y.size());for(i=0,F[0]=1;i<n;i++){for(intj=i+1;j>=0;j--){F[j]*=-x[i];if(j)F[j]+=F[j-1];}}mintdelta,c;std::vector<mint>ans(n),res(n);autodiv=[&](mintxi){delta=0;for(inti=n;i>0;i--){res[i-1]=(F[i]+delta);delta=(F[i]+delta)*xi;}returnres;};for(inti=0;i<n;i++){c=y[i];for(intj=0;j<n;j++){if(i!=j)c/=x[i]-x[j];}div(x[i]);for(intj=0;j<n;j++){ans[j]+=c*res[j];}}returnans;}#endif // AFMT_LAGRANGE
#line 1 "src/alfred/math/lagrange.hpp"
#line 1 "src/alfred/math/comb.hpp"
#include<vector>template<classmint>structComb{intn;std::vector<mint>_fac,_invfac,_inv;Comb(void):n{0},_fac{1},_invfac{1},_inv{0}{}Comb(intn):Comb(){init(n);}inlinevoidinit(intm){_fac.resize(m+1),_inv.resize(m+1),_invfac.resize(m+1);for(inti=n+1;i<=m;i++){_fac[i]=_fac[i-1]*i;}_invfac[m]=~_fac[m];for(inti=m;i>n;i--){_invfac[i-1]=_invfac[i]*i;_inv[i]=_invfac[i]*_fac[i-1];}n=m;}inlinemintfac(intm){if(m>n)init(m);return_fac[m];}inlinemintinvfac(intm){if(m>n)init(m);return_invfac[m];}inlinemintinv(intm){if(m>n)init(m);return_inv[m];}inlinemintbinom(intn,intm){if(n<m||m<0)return0;returnfac(n)*invfac(m)*invfac(n-m);}};#line 5 "src/alfred/math/lagrange.hpp"
#include<cassert>
#include<iostream>
#line 8 "src/alfred/math/lagrange.hpp"
template<classmint>inlinemintlagrange(std::vector<mint>x,std::vector<mint>y,mintk){mintans=0,cur;constintn=x.size();for(inti=0;i<n;i++){cur=y[i];for(intj=0;j<n;j++){if(j==i)continue;cur*=(k-x[j])/(x[i]-x[j]);}ans+=cur;}returnans;}// y[0] is placeholder.// If for all integer x_i in [1, n], we have f(x_i) = y_i (mod p), find f(k) mod p.template<classmint>inlinemintcont_lagrange(std::vector<mint>y,mintk){mintans=0;constintn=y.size()-1;Comb<mint>comb(n);std::vector<mint>pre(n+1,1),suf(n+2,1);for(inti=1;i<=n;i++)pre[i]=pre[i-1]*(k-i);for(inti=n;i>=1;i--)suf[i]=suf[i+1]*(k-i);for(inti=1;i<=n;i++){mintA=pre[i-1]*suf[i+1];mintB=comb.fac(i-1)*comb.fac(n-i);ans+=((n-i)&1?-1:1)*y[i]*A/B;}returnans;}// find 1^k + 2^k + ... + n^k. in O(k log k) of time complexity.template<classmint>inlinemintsum_of_kth_powers(mintn,intk){mintsum=0;std::vector<mint>Y{0};for(inti=1;i<=k+2;i++){Y.push_back(sum+=(mint)i^k);}returncont_lagrange(Y,n);}template<classmint>std::vector<mint>find_coefficient(std::vector<mint>x,std::vector<mint>y){// F(k) = \prod (k - x_i): n degree, n + 1 coefficients.intn=x.size(),i;std::vector<mint>F(n+1);assert(n==(int)y.size());for(i=0,F[0]=1;i<n;i++){for(intj=i+1;j>=0;j--){F[j]*=-x[i];if(j)F[j]+=F[j-1];}}mintdelta,c;std::vector<mint>ans(n),res(n);autodiv=[&](mintxi){delta=0;for(inti=n;i>0;i--){res[i-1]=(F[i]+delta);delta=(F[i]+delta)*xi;}returnres;};for(inti=0;i<n;i++){c=y[i];for(intj=0;j<n;j++){if(i!=j)c/=x[i]-x[j];}div(x[i]);for(intj=0;j<n;j++){ans[j]+=c*res[j];}}returnans;}