初見安~這裡是傳送門: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的序列,可以讓某一段區間的數字反轉,也可以詢問某個點的值 學過樹狀陣列的同學可能看出來了,這是一道樹狀陣列區間修改,單點查詢的變式,還沒有學過的同學可以看看這篇部落格樹狀陣列 路人 你這不是騙閱讀量嗎 我 略略略略略略略...