題解 仙人掌計數

2022-05-01 19:57:11 字數 3100 閱讀 5385

題目傳送門

給出\(q\)個查詢,每次查詢\(n\)個點的無根有標號仙人掌有多少個。

\(q\le 5\times 10^4,n< 131072\)

因為這道題太難碼了,所以先把題解寫了再寫**(好奇怪啊)終於碼出來了,果然還是\(\text \)好用(霧

為了方便,我們下面的答案其實求的是有根有標號的答案,最後除以\(n\)就好了。我們設\(c_n\)為\(n\)個點時的答案,我們對其構造指數型生成函式\(c(x)\):

\[c(x)=\sum_ c_i\frac

\]我們考慮欽定乙個根,然後連邊,顯然要麼連出去一條邊,要麼連出去乙個環。需要注意的是,連邊相當於把根與乙個仙人掌相連,連環的環其實是仙人掌連成乙個環。

於是,我們可以得到轉移式:

\[c(x)=x\exp (c(x)+\frac\sum_^ c^i(x))

\]除以\(2\)是因為乙個環無論正反都是一樣,但是我們計算時卻視作兩種情況。

將上式用等比數列求和公式可以得到:

\[c(x)=x\exp(\frac)

\]我們發現我們如果構造

\[f(c(x))=x\exp(\frac)-c(x)

\]我們即是要求導\(f(c(x))\)的根,對此,我們可以使用多項式牛頓迭代法。我們就需要求到\(f(c(x))\)的導:

\[f^(c(x))=(x\exp(\frac)-c(x))^

\]\[=x\exp (\frac)(\frac)^-1

\]\[=x\exp (\frac)\frac-1

\]於是,我們可以得到牛頓迭代法的式子:

\[c(x)=c_0(x)-\frac(c_0(x))}

\]\[=c_0(x)-\frac)-c(x)})\frac-1}

\]\[=c_0(x)-\frac)-2c_0(x)})x\exp (\frac)-2}

\]我們發現如果我們設\(g=x\exp (\frac)\),那麼式子就可以化為:

\[c(x)=c_0(x)-\frac)g-2}

\]

#pragma gcc optimize("ofast")

#pragma gcc optimize("inline", "no-stack-protector", "unroll-loops")

#pragma gcc diagnostic error "-fwhole-program"

#pragma gcc diagnostic error "-fcse-skip-blocks"

#pragma gcc diagnostic error "-funsafe-loop-optimizations"

#include using namespace std;

#define sz(x) ((int)x.size())

#define int register int

#define mod 998244353

#define maxn 1000005

int mul (int a,int b)

int dec (int a,int b)

int add (int a,int b)

int qkpow (int a,int k)

int inv (int x)

typedef vector poly;

int w[maxn],rev[maxn];

void init_ntt ()

void ntt (poly &a,int lim,int type)

for (int i = 0;i < lim;++ i) a[i] = d[i] % mod;

if (type == -1)

#undef g

#undef gi

}poly operator + (poly a,poly b)

poly operator - (poly a,poly b)

poly operator * (poly a,int b)

poly operator * (poly a,poly b)

poly operator << (poly a,int n)

poly inv (poly a,int n)

b.resize (n);

return b;

}poly inv (poly a)

poly der (poly a)

poly ine (poly a)

poly ln (poly a,int n)

poly ln (poly a)

poly exp (poly a,int n)

b.resize (n);

return b;

}poly exp (poly a)

int n,m,x;poly a;

poly work (int n)),b,c;

for (int l = 4;(l >> 1) < n;l <<= 1) - a),b = c * a,b.resize (l),b = (b + a) * inv (2);

b = exp (b),b = b << 1,c = c * c,c[0] = add (c[0],1),c.resize (l),c = c * inv (2) * b,c[0] = dec (c[0],1);

b = b - a;while (!b[0] && !c[0]) b.erase (b.begin()),c.erase (c.begin());

b.resize (l),c.resize (l);

a = a - b * inv (c),a.resize (l);

} a.resize (n);

return a;

}template inline void read (t &t)while (c >= '0' && c <= '9') t *= f;}

template inline void read (t &t,args&... args)

template inline void write (t x)if (x > 9) write (x / 10);putchar (x % 10 + '0');}

int q,len,fac[maxn],que[maxn];

signed main()

話說預處理原根真的好快啊!!!

ZJOI2017 仙人掌 題解

給出乙個無重邊無自環的無向連通圖 n 個點 m 條邊 問有多少種再往上加邊的方案,使得新圖是仙人掌。多組資料,n 5e5,m 先要判斷讀入的圖是否是仙人掌。部分分有樹,就先想樹怎麼做。很直觀地設 f i 表示 i 為根的子樹的方案數,g i 表示有一條路要往上走的方案數。不考慮根的匹配的話,那就是兒...

清華集訓2015 靜態仙人掌 仙人掌剖分

毒瘤仙人掌,明明放到樹上一道板題的非要構造到仙人掌上來出題orz orz orz orz orz 在oi的上古時代,流傳著這樣乙個故事 有一天,小w到森林裡遊玩,回來之後跟小v說,我發現好多棵會動的樹耶!小v說,這有什麼好稀奇的,我用手指頭就能維護每棵樹的形態。於是又過了幾天小w到沙漠裡遊玩,回來之...

動態仙人掌(dinosaur

分析 這道題在考場看到我是完全的蒙蔽的,驚人的妄想著能否用資料離散化後的dp來騙分。我果然很菜。好吧,對於我這種菜雞來說,正解似乎有些難想,讓我們考慮從最基本的情況開始考慮。先將所有仙人掌按p為第一關鍵字排序,從左向右掃。這裡我們考慮乙個貪心策略,如果仙人掌兩兩之間距離足夠遠,則仙人掌之間跳躍的最小...