BZOJ4913 SDOI2017 遺忘的集合

2022-04-28 19:54:11 字數 1466 閱讀 6125

luogu

bzoj

我們設\(a_i\in\\)表示\(i\)這個數有沒有出現在集合中。那麼\(f\)對應的生成函式就是:

\[f(x)=\prod_^(\frac)^

\]現在給出\(f(x)\),要求\(a_i\)。

先兩邊取對數。

\[-\ln f(x)=\sum_^na_i\ln(1-x^i)

\]然後有乙個這樣子的式子:

\[\ln(1-x^i)=-\sum_^\frac}

\]證明:(感謝@cyhlnj )

\[\ln f(x)=g(x)\\\frac=g'(x)\\\frac}=g'(x)\\-\sum_^ ix^=g'(x)\\-\sum_^\frac}=g(x)\\-\sum_^\frac}=g(x)

\]接上,把這個式子代入得

\[-\ln f(x)=-\sum_^na_i\sum_^\frac}

\]令\(t=ij\),代入並交換求和順序得

\[\ln f(x)=\sum_^x^t\sum_a_i\times \frac it

\]對\(f(x)\)求對數後就可以知道\(\sum_a_i\times\frac it\),再反演一下(可以不用莫比烏斯反演,直接\(o(n\ln n)\)就可以了)就可以求出\(a_i\)了。

\(bzoj\)上跑不過。

果然是人醜常數大。

#include#include#include#includeusing namespace std;

int gi()

const int n = 6e5+5;

const double pi = acos(-1);

struct complex

complex(double x,double y)

complex conj()

complex operator + (complex b)

complex operator - (complex b)

complex operator * (complex b)

}w[n],s1[n],s2[n],s3[n],s4[n],s5[n],s6[n];

int n,mod,qmod,rev[n],f[n],ans;

void fft(complex *p,int len);

for (int i=0;i>15};

for (int i=len2;i>=1;}

return res;

}int tmp[n];

void getinv(int *a,int *b,int len)

getinv(a,b,len>>1);mul(a,b,tmp,len);

for (int i=0;imul(tmp,b,b,len);

}int d[n],inv[n];

void getln(int *a,int *b,int len)

int main()

Bzoj 2726 SDOI 任務安排

memory limit 131072kb 64bit io format lld llu description 機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工...

BZOJ 3991 SDOI2015 尋寶遊戲

題目大意 給定一棵樹,其中有若干個關鍵點,任意選擇起點,求從起點出發訪問所有關鍵點又回到起點的最小邊權總和,有m個修改操作,每次修改乙個關鍵點。假如沒有修改操作的話,就像乙個簡單的樹形dp,方程如下 f i sigma sigma.觀察一下dp的過程,就是不斷地從前面的點走到後面的點,所以我們可以不...

SDOI2013 BZOJ3203 保護出題人

description input 第一行兩個空格隔開的正整數n和d,分別表示關數和相鄰殭屍間的距離。接下來n行每行兩個空格隔開的正整數,第i 1行為ai和 xi,分別表示相比上一關在殭屍佇列排頭增加血量為ai 點的殭屍,排頭殭屍從距離房子xi公尺處開始接近。output 乙個數,n關植物攻擊力的最...