白兔之舞 題解

2022-03-09 17:17:55 字數 2532 閱讀 6833

題意:白兔初始在 \((0,x)\) 的位置,每次跳躍要求第一維單增,第二維從 \(u\) 到 \(v\) 共 \(w_\) 條邊。第一維不能跳超過 \(l\),第二維取值在 \(1\) 到 \(n\) 之間。

設步數為 \(m\),詢問 \(m\bmod k=t\) 時的跳躍方案對 \(p\) 取模的結果。

題解:單位根反演的式子為:\(\frac\sum\limits_^\omega_^=[n|k]\)

當 \(n=1\) 時,設 \(w\) 為 \(w_\) 的結果,則答案為:

\[\begin

\sum\limits_^l [k|(i-t)]w^i\binom&=\sum\limits_^l\frac\sum\limits_^\omega_k^w^i\binom\\

&=\frac\sum\limits_^lw^i\binom\sum\limits_^\omega_k^\\

&=\frac\sum\limits_^\omega_k^\sum\limits_^lw^j\binom\omega_k^\\

&=\frac\sum\limits_^\omega^_k(w\omega _k^i+1)^l

\end

\]設 \(c_i=(w\omega_k^i+1)^l\)

則原式 \(=\frac\sum\limits_^\omega_k^+\binom-\binom}c_i=\frac\omega_k^}\sum\limits_^\omega_k^}c_i\omega_k^}\)

發現為卷積的形式。可以用任意模數 ntt 解決。

當 \(n\gt 1\) 時,設 \(begin\) 為初始矩陣,(只有 \(\left(1,x\right)\) 位置為 \(1\)),\(w\)為轉移矩陣,則 \(c_i\) 為 \(begin\times\left(w\omega_k^i+1\right)^l\) 這個矩陣的 \(\left(1,y\right)\) 位置的值。

**:

#include const int mod1 = 998244353;

const int mod2 = 1004535809;

const int mod3 = 469762049;

const int m = 1000005;

const int g = 3;

using namespace std;

int max_l,max_len,rev[m],c[m],w_k[m],n,k,l,x,y,p;

int read()

void write(long long x)

int power(int x,int y,int mod)

int add(int u,int v,int mod)

int sub(int u,int v,int mod)

int invs(int x,int mod)

const long long inv1=invs(mod1%mod2,mod2);

const long long mod1_2=mod1*(mod2+0ll);

const long long inv2=invs(mod1_2%mod3,mod3);

int get_root(int p)

if (tmp!=1) s[++s[0]]=tmp;

for (register int i=2;;i++)

if (flag) return i;

} return 0;

}struct number;

} number operator+= (const number &b)

number operator* (const number b) const;

} number operator*= (const number &b)

number operator- (const number b) const;

} number operator-= (const number &b)

number operator^ (const int b) const,now=*this;

for (register int i=b;i;i>>=1,now*=now)

if (i&1) ans*=now;

return ans;

}}w[m],inv[m],a[m],b[m];

number make_number (int x);}

long long get_ans(number now)

void prepare();inv[1]=(number);

for (register int i=2;i<=max_len;i++);

} for (register int i=(max_len>>1)+1;i>1)-1;i;i--) w[i]=w[i<<1];

return;

}void ntt(number *a,int len,int l,int flag)

}g,begin,i;

void mul(number *a,number *b,int len)

int main()

B 白兔的式子

已知f 1 1 1,f i j a f i 1 j b f i 1 j 1 i 2,1 j i 對於其他情況f i j 0 有t組詢問,每次給出a,b,n,m,求f n m mod 998244353 第一行為乙個整數t,表示詢問個數。接下來一共t行,每行四個整數a,b,n,m。一共t行,每行乙個整...

Sine之舞(遞迴)

基礎練習 sine之舞 時間限制 1.0s 記憶體限制 512.0mb 問題描述 最近fj為他的奶牛們開設了數學分析課,fj知道若要學好這門課,必須有乙個好的三角函式基本功。所以他準備和奶牛們做乙個 sine之舞 的遊戲,寓教於樂,提高奶牛們的計算能力。不妨設an sin 1 sin 2 sin 3...

白兔的字串

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld白兔有乙個字串t。白雲有若干個字串s1,s2 sn。白兔想知道,對於白雲的每乙個字串,它有多少個子串是和t迴圈同構的。所有字元都是小寫英文本母 輸入描述 第一行乙個字...