Open rsk0315 opened 2 years ago
実行時 mod int で <0>
は 10000、<1>
は 1234、みたいなのをやろうとすると、どうしても lazy_static!
的なのが欲しくなるはず
そもそも FFT の interface 自体困る
とりあえず上記のは、f(x) = a[0] + a[1] x + a[2] x^2 + ... + a[n - 1] x^(n - 1)
と mod p での 1 の原始 n 乗根 omega
に対して
(0..n).map(|i| a[i]).collect()
(0..n).map(|i| omega.gcd_recip(p).1.mod_pow(i, p)).collect()
p
を渡すことにしてみた。返すのは sum(a[j] omega ^ (i * j))
だけど、渡すのは omega の逆数の累乗なのでややこしいかも?
逆向きにアクセスすることにすれば omega の累乗でもいいけど、長さが n + 1 になるから微妙そう
omega
を渡すようにしたのは、どうせ畳み込みするときに同じものを 2 回使う必要があるからなんだけど、そもそも別で struct を作るとかの方がよかったりする? それもなんか微妙な気がするんだよねえ
さすがに速い FFT たちの中に Karatsuba 法だけで立ち向かうのはつらいので
コード
```rs use proconio::{fastout, input}; use nekolib::math::GcdRecip; const MOD: u64 = 998244353; #[fastout] fn main() { input! { n: usize, m: usize, a: [u64; n], b: [u64; m], } let c = convolution_mod(a, b, MOD); for &ci in &c { println!("{}", ci); } } fn convolution_mod(mut a: Vecそれはそれとして、いい感じの mod int とか、実行時 mod はどうしようとか、そういうのを考え出すと大変になる