Luogu 3321 SDOI2015 序列統計

2022-06-13 02:21:07 字數 1481 閱讀 8573

bzoj 3992

點開這道題之後才發現我對原根的理解大概只停留在$998244353$的原根是$3$……

關於原根: 點我

首先寫出$dp$方程,設$f_$表示序列長度為$i$當前所有數乘積模$m$為$j$的方案數,有轉移

$$f_ = \sum_ f_$$

把$x$和$y$取個對數就可以變成卷積的形式了。

然而在模意義下,我們可以用原根的$k$次方來代替原來的數,這樣子就達到了取對數的效果。

注意到每一次轉移形式都是相同的,我們可以用快速冪的方式來優化。

時間複雜度$o(mlogmlogn)$。

然而我的**只有在有$c++11$的時候才是對的,哪位大佬如果知道了為什麼教教我唄。

code:

#include #include 

#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;

}

view code

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 所以這個...