bzoj 3992
點開這道題之後才發現我對原根的理解大概只停留在$998244353$的原根是$3$……
關於原根: 點我
首先寫出$dp$方程,設$f_$表示序列長度為$i$當前所有數乘積模$m$為$j$的方案數,有轉移
$$f_ = \sum_ f_$$
把$x$和$y$取個對數就可以變成卷積的形式了。
然而在模意義下,我們可以用原根的$k$次方來代替原來的數,這樣子就達到了取對數的效果。
注意到每一次轉移形式都是相同的,我們可以用快速冪的方式來優化。
時間複雜度$o(mlogmlogn)$。
然而我的**只有在有$c++11$的時候才是對的,哪位大佬如果知道了為什麼教教我唄。
code:
#include #includeview code#include
#include
using
namespace
std;
typedef
long
long
ll;typedef vector
poly;
const
int n = 8005
;int
n, m, tar, fac[n], buc[n];
namespace
poly
inline ll fpow(ll x, ll y, ll mod =p)
return
res;
}inline
void prework(int
len)
inline
void ntt(poly &c, int
opt) }}
if (opt == -1
) }
poly
operator * (const poly x, const
poly y)
inline
void adj(poly &c)
inline poly pow(poly x,
inty)
return
res;
}}using
poly :: p;
using
poly :: fpow;
using
poly :: pow;
template
inline
void read(t &x)
inline
intgetroot()
if (flag) return
i; }
}int
main()
poly ans =pow(trans, n);
printf(
"%lld\n
", ans[buc[tar]]);
return0;
}
P3321 SDOI2015 序列統計
首先有個挺顯然的dp dp i j k m dp i 1 j times dp i 1 k 想辦法優化這個dp 這個dp也可以寫成這樣 dp i j sum dp i 1 p times dp i 1 q 看著一副卷積的樣子 但是是乘法,可以考慮轉化乘法為加法,有兩種方式,取ln或者原根 注意到m是...
Luogu2157 SDOI2009 學校食堂
link 給定 n 個學生的口味和忍耐度,若前一道菜的對應的口味是a,這一道為b,則做這道菜所需的時間為 a b a b 而做第一道菜是不需要計算時間的.每個學生可以忍耐忍耐度以下的人在他前面插隊買飯 求最小的做飯時間 n le 1000,b i le 8 令 f 表示第 i 個人前面的狀態是 s ...
luogu3706 SDOI2017 硬幣遊戲
link 硬幣遊戲 對於100分 我們不難想到這個矩陣過大 且沒有用的節點很多我們最後只要n個節點的答案 其他節點的答案可以不要。考慮把沒用的節點的答案壓到一點上。相同的套路 我們設f i 表示經過第i個點的期望次數 由於是到達某個點我們強制停止 所以概率 結果 期望次數。此時結果為1 0 所以這個...