洛谷 PMOI 2 簡單構造題

2021-10-21 15:08:13 字數 2515 閱讀 6664

初見安~這裡是傳送門:p7423 「pmoi-2」簡單構造題

好像確實是第一步難想…其他的都比較套路了……

顯然我們要脫離列舉區間左右端點這種策略,嘗試找到某個共性可以將一些區間收起來。考慮列舉區間長度。假設所有區間對總答案的貢獻。則答案就是:

含義為,這個區間首先有n-i+1個位置,其次另外的n-i個位置可以隨便放,這就是這個區間出現的所有情況。因為題意就是列舉了所有情況的所有區間,所以對於所求不會有重複計算的情況。

接下來我們就是算g了。因為現在要往

那麼關於g的生成函式就是:

這就是經典套路了。我們可以先on求出f,然後得到lnf(x)。因為對於每乙個i,f的第k項都個相當於乘上了乙個i^k,所以f的第k項要乘乙個:

這就是乙個經典的自然數冪和了。但是i是連續的,所以沒必要分治ntt。我們可以再次寫成egf:

e^x和e^分別是兩個多項式,展開n項後下面求個inv就是t了。

但是有個問題是,-1後常數項為0了,無法求inv。這裡用到乙個技巧是:上下兩個多項式同時除以x,也就是每一項都往前移一步。這樣操作後多項式t的值不會變。

於是這個題就解決掉啦。又是乙個多項式全家桶:)

上**——

#include#include#include#include#include#include#include#define maxn 1000006

using namespace std;

typedef long long ll;

const int mod = 998244353, mx = 3e5;

int read()

while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();

return x * f;

}int l, len, r[maxn];

void init(int n)

int pw(int a, int b) return res;}

void ntt(int *c, int flag)

} if(flag == -1)

}int n, m, f[maxn], f[maxn], a[maxn], b[maxn], tmp[maxn], fac[maxn], inv[maxn];

void get_inv(int *a, int *b, int n)

get_inv(a, b, n + 1 >> 1); init(n + n);

for(int i = 0; i < n; i++) tmp[i] = a[i];

for(int i = n; i <= len; i++) tmp[i] = 0;

ntt(tmp, 1); ntt(b, 1);

for(int i = 0; i < len; i++) b[i] = 1ll * b[i] * (2ll - 1ll * b[i] * tmp[i] % mod + mod) % mod;

ntt(b, -1); for(int i = n; i <= len; i++) b[i] = 0;

}void deriv(int *a, int n)

void integ(int *a, int n)

void get_ln(int *a, int *b, int n)

void get_exp(int *a, int *b, int n)

get_exp(a, b, n + 1 >> 1);

int c[maxn]; get_ln(b, c, n);

c[0] = (1ll - c[0] + a[0] + mod) % mod;

for(int i = 1; i < n; i++) c[i] = (a[i] - c[i] + mod) % mod;

ntt(c, 1), ntt(b, 1);

for(int i = 0; i < len; i++) b[i] = 1ll * b[i] * c[i] % mod;

ntt(b, -1);

for(int i = n; i <= len; i++) b[i] = 0;

}signed main() //623902740

迎評:)

——end——

PMOI 2 簡單構造題

定義乙個長度為 n 的序列 a 的權值為 sum n sum n f a l,r 其中 f a l,r f 就是在 a 的區間 l,r 中,所有在該區間內出現過的元素出現次數的乘積 再乘上 區間內所有元素的乘積 要求構造乙個長為 n 的序列,其中每個元素都是 1,m 中的整數,最大化其權值。她並不會...

洛谷3928 一道簡單題

標籤 dp,線段樹,資料結構 清晰版題目描述 小強拿到乙個3 n的陣列,要在每一列選乙個數 或者不選 滿足以下條件 1.如果在第一行選,那它必須大於等於上乙個數 2.如果在第二行選,那麼必須小於等於上乙個數 3.如果在第三行選,對於連續的一段在第三行選的數,必須滿足方向相同 都小於等於上乙個數或者都...

洛谷P5057簡單題 題解

這是我a的第一道省選題 可它的難度是普及 提高 傳送門題目大意 給定乙個初始為0的序列,可以讓某一段區間的數字反轉,也可以詢問某個點的值 學過樹狀陣列的同學可能看出來了,這是一道樹狀陣列區間修改,單點查詢的變式,還沒有學過的同學可以看看這篇部落格樹狀陣列 路人 你這不是騙閱讀量嗎 我 略略略略略略略...