Luogu4191 CTSC2010 效能優化

2022-05-07 18:39:12 字數 1534 閱讀 3258

傳送門

題目翻譯:給定兩個 \(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...