由於存在一道題叫做白兔之舞就導致這道題看上去非常的板\(......(\)如果按照這個方法推下來
約定,\([x]\)表示\(x\)向下取整
\[\sum_^n\dbinom\times p^i\times [\dfrac]
\]然後會想到可以將\([\dfrac]\)拆開變成:
\[\dfrac
\]於是原問題變成:
\[\sum_^n\dbinom\times p^i\times\dfrac
\]看到了\(i\%k\),然後還有組合數,然後\(k\)還是\(2\)的整數次冪,這個時候當然是單位根反演上場了...
\[\sum_^\sum_^n[i\%k==t]\dbinom\times \dfrac\times p^i
\]然後就是喜聞樂見的化式子了
\[\sum_^\sum_^n[(i-t)\%k==0]\dbinom\times \dfracp^i
\]\[\sum_^\sum_^n\dfrac\sum_^\omega_^ \times\dbinom \times\dfracp^i
\]\[\dfrac\sum_^\sum_^n\sum_^\omega_^ \times\dbinom\times(i-t)p^i
\]\[\dfrac\sum_^\sum_^n\sum_^\omega_^\times\omega_^ \times\dbinom\times(i-t)p^i
\]然後肯定要交換求和順序變成:
\[\dfrac\sum_^\sum_^\omega_^\sum_^\omega_^ \times \dbinom\times (i-t)p^i
\]然後這裡是可以將其拆開的...
\[\dfrac\sum_^\sum_^\omega_^\sum_^\omega_^ \times \dbinom\times i\times p^i-\dfrac\sum_^\sum_^\omega_^\sum_^\omega_^ \times \dbinom*tp^i
\]我們先忽略\(\dfrac\)
\[\sum_^\sum_^\omega_^\sum_^\omega_^ \times \dbinom\times i\times p^i-\sum_^t\times \sum_^\omega_^\sum_^\omega_^ \times \dbinomp^i
\]\[\sum_^\sum_^\omega_^\sum_^(\omega_^p)^i \times \dbinom\times i-\sum_^t\times \sum_^\omega_^\sum_^(\omega_^p)^i \times \dbinom
\]第二個式子很好處理,我們直接用二項式定理即可化開變成:
\[\sum_^t\times \sum_^\omega_^(\omega_^p+1)^n
\]然後對於某乙個\(j\),\((\omega_^p+1)^n\)為定值,設其為\(a_j\)
第乙個式子可以將組合數拆開
\[\sum_^\sum_^\omega_^\sum_^(\omega_^p)^i \times \dbinom\times i
\]\[\sum_^\sum_^\omega_^\sum_^(\omega_^p)^i \times \dfrac\times i
\]然後這個時候可以將\(i=0\)的那一項給忽略掉
\[\sum_^\sum_^\omega_^\sum_^(\omega_^p)^i \times \dfrac
\]\[\sum_^\sum_^\omega_^\sum_^(\omega_^p)^i \times \dfrac
\]\[n*\sum_^\sum_^\omega_^\sum_^(\omega_^p)^\times \dfrac
\]\[n*\sum_^\sum_^\omega_^\sum_^(\omega_^p)^*\omega_^jp\times \dfrac
\]\[n*\sum_^\sum_^\omega_^\times \omega_^jp\sum_^(\omega_^p)^\times \dfrac
\]\[n*\sum_^\sum_^\omega_^\times \omega_^jp\sum_^(\omega_^p)^\times \dbinom
\]\[n*\sum_^\sum_^\omega_^\times \omega_^jp\sum_^(\omega_^p)^\times \dbinom
\]\[n*\sum_^\sum_^\omega_^\times \omega_^jp*(\omega_^p+1)^
\]後面那一坨對於某乙個\(j\)也是固定的,我們可以設\(b_j=\omega_^jp*(\omega_^jp+1)^\)
那麼就有原式即:
\[n*\sum_^\sum_^\omega_^\times b_j-\sum_^t*\sum_^\omega_^a_j
\]然後我們就得到了乙個\(o(k^2)\)的做法了...
然後我們用一下白兔之舞的神仙操作\(tj=\dfrac-\dfrac-\dfrac\)
證明也很簡單,分子是:
\[(t+j)^2-t-j-j^2+j-t^2+t
\]\[2tj
\]所以原式就可以化成:
下面的組合數都反了,但我懶得改了qaq
\[n*\sum_^\sum_^\omega_^-\binom-\binom)}\times b_j-\sum_^t*\sum_^\omega_^-\binom-\binom)}a_j
\]\[n*\sum_^\sum_^\omega_^+\binom+\binom}\times b_j-\sum_^t\times \sum_^\omega_^+\binom+\binom}a_j
\]\[n*\sum_^\sum_^\omega_^} \omega_^}\omega_k^}*b_j-\sum_^\sum_^\omega_^} t\times \omega_^}\omega_k^}a_j
\]然後如果我們將\(t+k\)看作乙個整體那麼就會發現這是乙個卷積的形式
然後就只需要將\(\omega_^}\)和\(\omega_k^}\times b_j\)以及\(t\times \omega_^}\)和\(\omega_k^}\times a_j\)分別卷起來即可,暴力卷是需要\(\rm 6ntt\)的...
還擔心會\(\rm t\)來著...然而事實上也不慢,開\(\rm o2\)最慢的點才\(1.3s\)..不過其實可以做\(\rm 3fft\)的...因為卷起來可以將結果乘起來再加起來...同時把兩個多項式的\(\rm dft\)算出來需要\(3\)次變\(2\)次的技巧...所以速度應該會還可以
複雜度\(o(k\log k)\)
\(code:\)
#includeusing namespace std ;
#define rep( i, s, t ) for( register int i = s; i <= t; ++ i )
#define re register
#define ll long long
#define int long long
int gi()
while( cc >= '0' && cc <= '9' ) cn = cn * 10 + cc - '0', cc = getchar() ;
return cn * flus ;
}const int gi = 332748118 ;
const int p = 998244353 ;
const int n = 4e6 + 5 ;
const int g = 3 ;
int n, p, m, limit, l, r[n] ;
ll a[n], b[n], f[n], f2[n], dg[n], inv ;
ll fpow( ll x, int k )
return ans % p ;
}void ntt( ll *a, int type )
} if( type != 1 ) rep( i, 0, limit - 1 ) a[i] = ( a[i] * inv ) % p ;
}void init()
ll c( int x )
signed main()
因為多項式實在是做少了所以調得非常自閉...,下次再寫我開陣列絕對不這麼吝嗇qaq我錯了 題解 P5591 小豬佩奇學數學
sum n tbinomp i lfloor frac ik rfloor pmod 1 leq n,p 998244353,k in 0 leq w leq 20 首先知道乙個結論 n k sum omega n 下面將用這個柿子亂搞。sum n tbinomp i lfloor frac ik ...
Python 畫小豬佩奇
我們將用python 畫出當下最時尚的小豬佩奇!直接上 from turtle import def nose x,y 鼻子 penup 提起筆 goto x,y 定位 pendown 落筆,開始畫 setheading 30 將烏龜的方向設定為to angle 為數字 0 東 90 北 180 西...
python畫小豬佩奇
coding utf 8 import turtle as t t.pensize 4 設定畫筆的大小 t.colormode 255 設定gbk顏色範圍為0 255 t.color 255,155,192 pink 設定畫筆顏色和填充顏色 pink t.setup 840,500 設定主視窗的大小...