Skip to content

Commit 5432dc0

Browse files
committed
convolution on multiplicative monoid test
1 parent 51732a6 commit 5432dc0

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

verify/poly/convolution_mul.test.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// @brief Convolution on the Multiplicative Monoid of $\mathbb Z/p\mathbb{Z}$
2+
#define PROBLEM "https://judge.yosupo.jp/problem/mul_modp_convolution"
3+
#pragma GCC optimize("Ofast,unroll-loops")
4+
#define CP_ALGO_CHECKPOINT
5+
#include <bits/stdc++.h>
6+
#include "blazingio/blazingio.min.hpp"
7+
#include "cp-algo/number_theory/euler.hpp"
8+
#include "cp-algo/math/fft.hpp"
9+
10+
using namespace std;
11+
12+
using base = cp_algo::math::modint<998244353>;
13+
14+
void solve() {
15+
int p;
16+
cin >> p;
17+
auto g = cp_algo::math::primitive_root(p);
18+
vector<int> lg(p);
19+
int64_t cur = 1;
20+
for(int i = 0; i < p - 1; i++) {
21+
lg[cur] = i;
22+
cur *= g;
23+
cur %= p;
24+
}
25+
base a0, b0, as = 0, bs = 0;
26+
vector<base> a(p-1), b(p-1);
27+
cin >> a0;
28+
for(int i = 1; i <= p - 1; i++) {
29+
cin >> a[lg[i]];
30+
as += a[lg[i]];
31+
}
32+
cin >> b0;
33+
for(int i = 1; i <= p - 1; i++) {
34+
cin >> b[lg[i]];
35+
bs += b[lg[i]];
36+
}
37+
base c0 = (a0 + as) * (b0 + bs) - as * bs;
38+
cout << c0 << " ";
39+
cp_algo::math::fft::mul(a, b);
40+
for(size_t i = p-1; i < size(a); i++) {
41+
a[i - (p-1)] += a[i];
42+
}
43+
for(int i = 1; i <= p - 1; i++) {
44+
cout << a[lg[i]] << " ";
45+
}
46+
}
47+
48+
signed main() {
49+
//freopen("input.txt", "r", stdin);
50+
ios::sync_with_stdio(0);
51+
cin.tie(0);
52+
solve();
53+
}

0 commit comments

Comments
 (0)