PMOI 2 簡單構造題

2022-06-22 23:36:16 字數 1972 閱讀 4692

定義乙個長度為\(n\)的序列\(a\)的權值為:

\[\sum_^n\sum_^n f_a(l,r)

\]其中\(f_a(l,r)f\)就是在\(a\)的區間\([l,r]\)中,「所有在該區間內出現過的元素出現次數的乘積」再乘上「區間內所有元素的乘積」。

要求構造乙個長為\(n\)的序列,其中每個元素都是\([1,m]\)中的整數,最大化其權值。

她並不會,只好均勻隨機\(n\)個\([1,m]\)中的整數組成乙個數列,然後輸出其權值。

當然,她的這份程式一分都沒拿到;但她想知道,生成出的序列期望權值是多少。

為了防止精度問題,答案需要對\(998244353\)取模。

想到第一步之後就是做爛的套路了...

可以統計每種長度的所有區間的貢獻。設\(g_n\)為所有長度為\(i\)的區間的貢獻,那麼答案就是:

\[ans=\sum_^ng_i(n-i+1)m^

\]由於數的位置不同數列就不同,我們可以寫出選每種數的\(egf\):

\[f(x)=\sum_\frac=\sum_\frac

\]那麼\(g\)的\(egf\)就可以表示成:

\[g(x)=\prod_^f(ix)=\exp(\sum_^n\ln f(ix))

\]那麼求出\(\ln f(x)\)的係數之後,第\(n\)次項係數乘上\(\sum_^mi^n\)就是\(\sum \ln f(ix)\)的\(n\)次項係數。

現在就是做爛了的自然數冪和。寫出這個東西的\(egf\):

\[h(x)=\sum_(\sum_^mi^n)\frac

=\sum_^m\sum_\frac

=\sum_^me^=\frac-1}

\]這裡為了方便讓\(i\)從\(0\)開始的,最後求出係數後讓\(0\)次項為\(0\)即可。但是這裡分母的\(0\)次項為\(0\),怎麼求逆呢?注意到分子的\(0\)次項也是\(0\),所以同時給分子分母都除個\(x\)即可。總複雜度\(\mathcal(n\log n)\)

#include#define rg register

#define il inline

#define cn const

#define fp(i,a,b) for(rg int i=(a),ed=(b);i<=ed;++i)

#define fb(i,a,b) for(rg int i=(a),ed=(b);i>=ed;--i)

using namespace std;

typedef cn int cint;

cint maxn = 200010, mod = 998244353, g = 3, invg = (mod+1)/3;

int n, m, fac[maxn] = , ifac[maxn], inv[maxn] = ;

int f[maxn] = , ln[maxn<<2], g[maxn<<2], ans;

int a[maxn<<2], b[maxn<<2], h[maxn<<2], pw = 1;

int lim, hst, rev[maxn<<2];

il int fpow(int a, int b, int ans = 1)

il void init(int n)

} }if(!typ)return;

rg int inv = fpow(lim, mod-2);

fp(i, 0, lim-1)a[i] = 1ll*a[i]*inv%mod;

}int inv_ary[maxn<<2];

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

int ln_ary[maxn<<2];

il void get_ln(int *a, int *f, int n)

int exp_ary[maxn<<2];

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

int main()

洛谷 PMOI 2 簡單構造題

初見安 這裡是傳送門 p7423 pmoi 2 簡單構造題 好像確實是第一步難想 其他的都比較套路了 顯然我們要脫離列舉區間左右端點這種策略,嘗試找到某個共性可以將一些區間收起來。考慮列舉區間長度。假設所有區間對總答案的貢獻。則答案就是 含義為,這個區間首先有n i 1個位置,其次另外的n i個位置...

492 構造矩形(簡單題)

題目描述 作為一位web開發者,懂得怎樣去規劃乙個頁面的尺寸是很重要的。現給定乙個具體的矩形頁面面積,你的任務是設計乙個長度為 l 和寬度為 w 且滿足以下要求的矩形的頁面。要求 你設計的矩形頁面必須等於給定的目標面積。寬度 w 不應大於長度 l,換言之,要求 l w 長度 l 和寬度 w 之間的差...

一 leetcode 簡單題 2

21.將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。一次ac,13分鐘寫完,中途接了一次中國聯通推廣 思路簡單 struct listnode mergetwolists struct listnode l1,struct listnode l2...