傳送門
題目翻譯:給定兩個 \(n\) 次多項式 \(a,b\) 和乙個整數 \(c\),求 \(a\times b^c\) 在模 \(x^n\) 意義下的卷積
顯然就是個迴圈卷積,所以只要代入 \(\omega_n^\) 進去求出點值,然後插值就好了
???\(n\) 不是 \(2^k\) 的形式,不能直接 \(ntt\)
怎麼辦呢?
根據題目性質,可以把 \(n\) 拆成 \(2^3^5^7^\) 的形式
這啟示我們每次不是每次分成兩半而是拆分成 \(3/5/7\) 次,然後再合併點值
設 \(f(x)=\sum a_ix^i,f_r(x)=\sum a_x^i\)
那麼 \(f(x)=\sum x^rf(x^p)\)
根據單位複數的性質(消去引理和折半引理)那麼
\[f(\omega_n^)=\sum \omega_^f_r(w_n^b)
\]那麼只需要寫乙個每次分 \(p\) 份的 \(fft\) 就好了
# include using namespace std;
typedef long long ll;
const int maxn(5e5 + 5);
int n, c, a[maxn], b[maxn], tmp[maxn], g, pri[233333], tot, pw[2][maxn], mod, r[maxn];
inline int pow(ll x, int y)
inline void inc(int &x, int y)
int dfs(int s, int p, int cur, int blk)
inline void dft(int *p, int opt)
if (opt == -1) for (c = pow(n, mod - 2), i = 0; i < n; ++i) p[i] = (ll)p[i] * c % mod;
}int main()
for (i = 0; i < n; ++i) scanf("%d", &a[i]);
for (i = 0; i < n; ++i) scanf("%d", &b[i]);
pw[0][0] = pw[1][0] = 1, pw[0][1] = g, pw[1][1] = pow(g, mod - 2);
for (i = 2; i < n; ++i) pw[0][i] = (ll)pw[0][i - 1] * g % mod, pw[1][i] = (ll)pw[1][i - 1] * pw[1][1] % mod;
for (i = 0; i < n; ++i) r[i] = dfs(0, i, 1, n);
dft(a, 1), dft(b, 1);
for (i = 0; i < n; ++i) a[i] = (ll)a[i] * pow(b[i], c) % mod;
dft(a, -1);
for (i = 0; i < n; ++i) printf("%d\n", a[i]);
return 0;
}
Luogu4191 CTSC2010 效能優化
傳送門 題目翻譯 給定兩個 n nn 次多項式 a,b a,ba,b 和乙個整數 c cc,求 a b ca times b c a bc 在模 x nx n xn意義下的卷積 顯然就是個迴圈卷積,所以只要代入 nk omega n nk 進去求出點值,然後插值就好了 n nn 不是 2 k2 k ...
Luogu食物鏈做法2
這個題的做法2比做法1好想 以下距離都在 mod 3意義下 到最後所有動物的關係可以用樹表示,d i 表示節點i到當前fa i 的距離,我們規定若d x 1 d y 規定成 1也可以 代表x吃y 那麼如果x y同族,那麼如果規定x當前祖先到y當前距離為的d y d x 這樣x到y祖先距離為d x 到...
CTSC2018 Day2T1 Juice混合果汁
題解 在考場上a掉的題。把美味度排個序,然後按照 p為權值建立主席樹,把每個果汁按照拍好的順序新增進去。主席樹上維護總公升數cnt以及總 sum。對於每個詢問,我們二分乙個美味值,check的時候去主席樹上查詢大於等於這個美味值的果汁中購買l公升的 即可。1 include2 include3 de...