2#include"../../kyopro_library/template.hpp"
5#include<atcoder/convolution>
6#include<atcoder/modint>
14 return atcoder::convolution(a,b);
20 vector<T> res(max(a.size(),b.size()));
21 for(
int i=0; i<res.size(); i++) {
22 if(i<a.size()) res[i]+=a[i];
23 if(i<b.size()) res[i]+=b[i];
31 vector<T> res(max(a.size(),b.size()));
32 for(
int i=0; i<res.size(); i++) {
33 if(i<a.size()) res[i]+=a[i];
34 if(i<b.size()) res[i]-=b[i];
42 if(len==-1) len=f.size();
50 vector<T> n_g(s*2,0),f_s(s*2,0);
52 for(
int i=0; i<s*2; i++) {
53 if(
int(f.size())>i) f_s[i]=f[i];
56 atcoder::internal::butterfly(g);
57 atcoder::internal::butterfly(f_s);
58 for(
int i=0; i<s*2; i++) f_s[i]*=g[i];
59 atcoder::internal::butterfly_inv(f_s);
61 for(
int i=s; i<s*2; i++) f_s[i]*=iz;
62 for(
int i=0; i<s; i++) f_s[i]=0;
63 atcoder::internal::butterfly(f_s);
64 for(
int i=0; i<s*2; i++) f_s[i]*=g[i];
65 atcoder::internal::butterfly_inv(f_s);
66 for(
int i=s; i<s*2; i++) n_g[i]-=f_s[i]*iz;
76 atcoder::internal::butterfly(f);
77 atcoder::internal::butterfly(g);
78 for(
int i=0; i<(
int)f.size(); i++) f[i]*=g[i];
79 atcoder::internal::butterfly_inv(f);
80 T iz=(T)(1)/(T)(f.size());
81 for(
int i=0; i<(
int)f.size(); i++) f[i]*=iz;
88 if(f.empty())
return f;
89 vector<T> num_inv((
int)f.size()+1);
90 num_inv[0]=1; num_inv[1]=1;
92 for(
int i=2; i<=(
int)f.size(); i++) num_inv[i]=(0-num_inv[m%i])*(T)(m/i);
93 f.reserve((
int)f.size()+1);
95 for(
int i=(
int)f.size()-1; i>0; i--) f[i]=f[i-1]*num_inv[i];
103 if(f.empty())
return f;
104 for(
int i=0; i<(
int)f.size()-1; i++) f[i]=f[i+1]*(T)(i+1);
112 if(len==-1) len=f.size();
114 if(len==1)
return{T(1)};
115 assert(!f.empty()&&f[0]==0);
126 A=CyclicConvolution(A,B);
129 for(
int i=0; i<s; i++) A[i]=0;
130 for(
int i=s; i<s*2; i++) A[i]=(i<(
int)f.size()?f[i]:0)-A[i];
134 B=CyclicConvolution(A,g);
135 for(
int i=s; i<s*2; i++) g[i]=B[i];
145 if(len==-1) len=f.size();
147 if(len==1)
return{T(0)};
148 assert(!f.empty()&&f[0]==1);
149 vector<T> res=atcoder::convolution(Differential(f),Inv(f,len));
151 return Integral(res);
157 if(len==-1) len=f.size();
158 vector<T> res(len,0);
163 for(
int i=0; i<(
int)f.size(); i++) {
164 if(f[i]==0)
continue;
165 if(i>(len-1)/M)
break;
166 vector<T> g((
int)f.size()-i);
167 T v=(T)(1)/(T)(f[i]);
168 for(
int j=i; j<(
int)f.size(); j++) g[j-i]=f[j]*v;
181 for(
int i=0; i<len; i++) res[i+zero]=g[i]*c;
192 T e=(T(atcoder::internal::primitive_root_constexpr(T::mod()))).pow(T::mod()/(2*z));
194 atcoder::internal::butterfly_inv(cp);
196 for(
int i=0; i<z; i++) {
200 atcoder::internal::butterfly(cp);
201 for(
int i=0; i<z; i++) v.push_back(cp[i]);
208 T half=(T)(1)/(T)(2);
210 for(
int i=0; i<z; i++) v[i]=(v[i*2]+v[i*2+1])*half;
213 T e=(T(atcoder::internal::primitive_root_constexpr(T::mod()))).pow(T::mod()/(2*z));
216 while((
int)es.size()!=z) {
217 vector<T> n_es((
int)es.size()*2);
218 for(
int i=0; i<(
int)es.size(); i++) {
220 n_es[i*2+1]=(es[i]*ie);
225 for(
int i=0; i<z; i++) v[i]=(v[i*2]-v[i*2+1])*es[i];
234 if(
n<
m)
return{{},
f};
250 assert(!Q.empty()&&Q[0]!=0);
252 while(z<(
int)max(P.size(),Q.size())) z*=2;
253 P.resize(z*2,0); Q.resize(z*2,0);
254 atcoder::internal::butterfly(P); atcoder::internal::butterfly(Q);
259 for(
int i=0; i<z; i++) {
263 for(
int i=0; i<z*2; i++) {
275 for(
int i=0; i<z; i++) SP+=P[i],SQ+=Q[i];
286 assert(d+1==
int(c.size()));
287 vector<T> P=atcoder::convolution(a,c);
289 return BostanMori(k,P,c);
形式的冪級数 borrowed from:https://potato167.github.io/po167_library
vector< T > Log(vector< T > f, int len=-1)
多項式 f について、log(f) を返す
vector< T > Differential(vector< T > f)
多項式 f の微分を返す
void Extend(vector< T > &v)
vector< T > CyclicConvolution(vector< T > f, vector< T > g)
vector< T > Sub(const vector< T > &a, const vector< T > &b)
多項式 f, g の差を返す
vector< T > Exp(vector< T > f, int len=-1)
多項式 f について、e^f を返す
vector< T > Inv(vector< T > f, int len=-1)
多項式 f に対し、f*g = 1 なる g を返す
void PickEvenOdd(vector< T > &v, int odd)
vector< T > Integral(vector< T > f)
多項式 f の積分を返す
vector< T > Mul(const vector< T > &a, const vector< T > &b)
多項式 f, g の積を返す
vector< T > Add(const vector< T > &a, const vector< T > &b)
多項式 f, g の和を返す
T BostonMori(ll k, vector< T > P, vector< T > Q)
[x^k](P/Q) を返す
T KthLinear(ll k, vector< T > a, vector< T > c)
vector< T > Pow(vector< T > f, ll M, int len=-1)
多項式 f^M を返す