1
+ #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
2
+ #pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,abm,mmx,tune=native")
3
+ #include < algorithm>
4
+ #include < cmath>
5
+ #include < cstdio>
6
+ #include < cstdlib>
7
+ #include < cstring>
8
+ #define MAXN 500010
9
+ using lnt = long long ;
10
+ const lnt MOD = 75161927681LL ;
11
+ const lnt G = 3 ;
12
+ inline lnt mul (lnt x, lnt y) { return (x * y - (lnt)((long double )x / MOD * y) * MOD + MOD) % MOD; }
13
+ inline void trim (lnt &x) { x -= MOD, x += (x >> 63 ) & MOD; }
14
+ inline lnt fuck (lnt x, lnt y) {
15
+ lnt z = 1 ;
16
+ for (; y; y >>= 1 ) {
17
+ if (y & 1 ) z = mul (z, x);
18
+ x = mul (x, x);
19
+ }
20
+ return z;
21
+ }
22
+ lnt wns[20 ][MAXN], invs[20 ];
23
+ int revs[20 ][MAXN];
24
+ inline void pre () {
25
+ for (int n = 1 , kk = 0 ; n < MAXN; n <<= 1 , kk++) {
26
+ lnt wn = fuck (G, (MOD - 1 ) / n);
27
+ wns[kk][0 ] = 1 ;
28
+ for (int i = 1 ; i < (n >> 1 ); i++) wns[kk][i] = mul (wns[kk][i - 1 ], wn);
29
+ invs[kk] = fuck (n, MOD - 2 );
30
+ for (int i = 1 , j = 0 ; i < n - 1 ; i++) {
31
+ for (int t = n; ~j & t; j ^= t) t >>= 1 ;
32
+ revs[kk][i] = j;
33
+ }
34
+ }
35
+ }
36
+ inline void NTT (int *rev, lnt *a, int n) {
37
+ for (int i = 1 ; i < n - 1 ; i++) {
38
+ if (i < rev[i]) std::swap (a[i], a[rev[i]]);
39
+ }
40
+ for (int k = 1 , kk = 1 ; k < n; k <<= 1 , kk++) {
41
+ int t = k << 1 ;
42
+ for (int i = 0 ; i < n; i += t) {
43
+ for (int j = 0 ; j < k; j++) {
44
+ lnt x = a[i + j], y = mul (wns[kk][j], a[i + j + k]);
45
+ trim (a[i + j] = x + y);
46
+ trim (a[i + j + k] = x - y + MOD);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ int m, cnt = 0 ;
52
+ lnt f[MAXN], g[MAXN], h[MAXN];
53
+ inline std::pair<int , int > solve (int l, int r) {
54
+ if (l == r) {
55
+ f[cnt++] = (m - l) % m;
56
+ f[cnt++] = 1 ;
57
+ return {cnt - 2 , 2 };
58
+ }
59
+ int mid = (l + r) >> 1 ;
60
+ auto L = solve (l, mid), R = solve (mid + 1 , r);
61
+ int n = 1 , nn = 0 , len = L.second + R.second - 1 ;
62
+ while (n < len) n <<= 1 , nn++;
63
+ memcpy (g, f + L.first , sizeof (lnt) * L.second );
64
+ memset (g + L.second , 0 , sizeof (lnt) * (n - L.second ));
65
+ memcpy (h, f + R.first , sizeof (lnt) * R.second );
66
+ memset (h + R.second , 0 , sizeof (lnt) * (n - R.second ));
67
+ NTT (revs[nn], g, n), NTT (revs[nn], h, n);
68
+ for (int i = 0 ; i < n; i++) g[i] = mul (g[i], h[i]);
69
+ NTT (revs[nn], g, n);
70
+ std::reverse (g + 1 , g + n);
71
+ lnt inv = invs[nn];
72
+ for (int i = 0 ; i < n; i++) g[i] = mul (g[i], inv) % m;
73
+ std::memcpy (f + L.first , g, sizeof (lnt) * len);
74
+ return {L.first , len};
75
+ }
76
+ int main () {
77
+ freopen (" polynomial.in" , " r" , stdin);
78
+ freopen (" polynomial.out" , " w" , stdout);
79
+ pre ();
80
+ scanf (" %d" , &m);
81
+ auto ans = solve (0 , m - 1 );
82
+ printf (" %d\n " , ans.second - 1 );
83
+ for (int i = ans.first + ans.second - 1 ; i >= ans.first ; i--) printf (" %lld " , f[i]);
84
+ return 0 ;
85
+ }
0 commit comments