題意:白兔初始在 \((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迴圈同構的。所有字元都是小寫英文本母 輸入描述 第一行乙個字...