12
12
typedef Mod num ;
13
13
typedef vector < num > poly ;
14
14
vector < Mod > conv (vector < Mod > a , vector < Mod > b ) {
15
- auto res = convMod < mod > (vl (all (a )), vl (all (b )));
15
+ // auto res = convMod<mod>(vl(all(a)), vl(all(b)));
16
+ auto res = conv (vl (all (a )), vl (all (b )));
16
17
return vector < Mod > (all (res ));
17
18
}
18
- poly & operator += (poly & a , poly & b ) {
19
+ poly & operator += (poly & a , const poly & b ) {
19
20
a .resize (max (sz (a ), sz (b )));
20
- rep (i ,0 , sz (b )) a [i ] = a [i ] + b [i ];
21
+ rep (i , 0 , sz (b )) a [i ] = a [i ] + b [i ];
21
22
return a ;
22
23
}
23
- poly & operator -= (poly & a , poly b ) {
24
+ poly & operator -= (poly & a , const poly & b ) {
24
25
a .resize (max (sz (a ), sz (b )));
25
- rep (i ,0 , sz (b )) a [i ] = a [i ] - b [i ];
26
+ rep (i , 0 , sz (b )) a [i ] = a [i ] - b [i ];
26
27
return a ;
27
28
}
28
- poly & operator *=(poly & a , poly & b ) { return a = conv (a , b ); }
29
+ poly & operator *=(poly & a , const poly & b ) { return a = conv (a , b ); }
30
+ poly operator * (poly a , const num b ) {
31
+ poly c = a ;
32
+ trav (i , c ) i = i * b ;
33
+ return c ;
34
+ }
29
35
#define OP (o , oe ) \
30
36
poly operator o(poly a, poly b) { \
31
37
poly c = a; \
@@ -39,13 +45,13 @@ poly inverse(poly A) {
39
45
B = modK (B * (poly ({num (2 )}) - A * B ), 2 * sz (B ));
40
46
return modK (B , sz (A ));
41
47
}
42
- poly & operator /= (poly & a , poly & b ) {
48
+ poly & operator /= (poly & a , poly b ) {
43
49
if (sz (a ) < sz (b ))
44
50
return a = {};
45
51
int s = sz (a ) - sz (b ) + 1 ;
46
52
reverse (all (a )), reverse (all (b ));
47
53
a .resize (s ), b .resize (s );
48
- a *= inverse (b );
54
+ a = a * inverse (b );
49
55
a .resize (s ), reverse (all (a ));
50
56
return a ;
51
57
}
@@ -70,7 +76,7 @@ poly integr(poly a) {
70
76
if (a .empty ())
71
77
return {0 };
72
78
poly b (sz (a ) + 1 );
73
- rep (i ,1 , sz (b )) b [i ] = a [i - 1 ] / num (i );
79
+ rep (i , 1 , sz (b )) b [i ] = a [i - 1 ] / num (i );
74
80
return b ;
75
81
}
76
82
poly log (poly a ) { return modK (integr (deriv (a ) * inverse (a )), sz (a )); }
@@ -79,9 +85,21 @@ poly exp(poly a) {
79
85
if (a .empty ())
80
86
return b ;
81
87
while (sz (b ) < sz (a )) {
82
- b .resize (sz (b )* 2 );
88
+ b .resize (sz (b ) * 2 );
83
89
b *= (poly ({num (1 )}) + modK (a , sz (b )) - log (b ));
84
- b .resize (sz (b )/ 2 + 1 );
90
+ b .resize (sz (b ) / 2 + 1 );
85
91
}
86
92
return modK (b , sz (a ));
87
93
}
94
+ poly pow (poly a , ll m ) {
95
+ int p = 0 ; int n = sz (a );
96
+ while (p < sz (a ) && a [p ].x == 0 )
97
+ ++ p ;
98
+ num j = a [p ];
99
+ a = {a .begin () + p , a .end ()};
100
+ a = a * (num (1 ) / j );
101
+ a .resize (n );
102
+ auto res = exp (log (a ) * num (m )) * (j ^ m );
103
+ res .insert (res .begin (), p * m , 0 );
104
+ return modK (res , n );
105
+ }
0 commit comments