2#include"../../kyopro_library/template.hpp"
3#include"../../kyopro_library/others/modcal.hpp"
6template<ll MOD, ll primitive_root>
9 vector<ll> roots,inv_roots,tmp;
11 void ntt(vector<ll>& a,
bool inv=
false) {
13 for(
int i=n>>1; i>=1; i>>=1) {
14 auto& cur=((p&1) ? tmp : a);
15 auto& nxt=((p&1) ? a : tmp);
16 ll e=(inv ? roots[p+1] : inv_roots[p+1]);
18 for(
int j=0; j<n; j+=i) {
19 REP(k,i) nxt[j+k]=(cur[((j<<1)&mask)+k]+w*cur[(((j<<1)+i)&mask)+k])%MOD;
27 for(
int i=0; i<n; i++) (a[i]*=inv_sz)%=MOD;
35 while(n%2==0) n>>=1,divide_max++;
36 roots=vector<ll>(divide_max+1);
37 inv_roots=vector<ll>(divide_max+1);
38 roots[0]=inv_roots[0]=1;
39 for(
int i=1; i<=divide_max; i++) {
40 roots[i]=ModPow(primitive_root,(MOD-1)/(1<<i),MOD);
41 inv_roots[i]=ModInv(roots[i],MOD);
48 while(n+1<a.size()+b.size()) n<<=1;
51 vector<ll> fa(n), fb(n);
52 for(
int i=0; i<a.size(); i++) fa[i]=a[i];
53 for(
int i=0; i<b.size(); i++) fb[i]=b[i];
56 for(
int i=0; i<n; i++) (fa[i]*=fb[i])%=MOD;
59 while(fa.size()+1>a.size()+b.size()) fa.pop_back();
ll ModInv(ll a, ll m)
x^(-1) (mod m) を返す
vector< ll > convolve(vector< ll > a, vector< ll > b)
a, b の畳み込み mod M を求める