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關植物攻擊力的最...