BJ模擬(2) D2T1 簡單粗暴的題目

2021-07-28 06:19:38 字數 1566 閱讀 1889

簡單粗暴的題目

題目背景:

thoj25

分析:本題一看真的很粗暴,在一想也的確非常粗爆,那麼我們就用粗暴的方法,首先,我們發現直接暴力,我們需要算n2

個數的k

次方,顯然複雜度上是不能接受的,我們發現對於第i個

answer

其實就是,

s(i)

k+ (s(i)+ s(i - 1))

k+ (s(i) + s(i - 1) + s(i - 2))

k+ ... + (s(i)+ s(i - 1) +...+ s(1))k,

我們考慮對於

s進行乙個求和,我們令

sum(i) = s(1) + s(2) +... + s(i),

那麼針對每乙個等式,我們所求的就應該是

ans(i) = (sum(i))

k+ (sum(i) 

–sum(1))

k+ (sum(i) 

–sum(2))

k+ (sum(i) 

–sum(3))

k+...+ (sum(i) 

–sum(i - 1))k, 

那我們用二項式定理將其展開後就發現,我們可以通過暴力求的

sum(i)

的0 ~ k

次方,預處理出組合數,然後每一次將乙個

sum累加進陣列,然後和下乙個

sum進行計算,因為係數相同完全可以將每一項的

i次方合併在一起。

source:

#include 

#include

#include

#include

#include

#include

#include

using namespace std; inline char read() return *s++; } template

inline bool r(t &x) for (x = 0; isdigit(c); c = read()) x = (x << 3) + (x << 1) + (c ^ '0'); if (iosig) x = -x; return true; } const int out_len = 1024 * 1024; char obuf[out_len], *oh = obuf; inline void writechar(char c) template

inline void w(t x) } inline void flush() const int mod = 1e9 + 7; const int maxn = 50000 + 10; const int maxk = 100 + 10; int n, k; int s[maxn], val[maxk], cur[maxk], c[maxk][maxk]; long long ans; inline void readin() inline void pre(int k) template

inline void add(t &x, int t) inline void work() } int main()

九校2D2T1 旋轉子段

zyl有n張牌編號分別為1,2,n。他把這n張牌打亂排成一排,然後他要做一次旋轉使得旋轉後固定點盡可能多。如果第i個位置的牌的編號為i,我們就稱之為固定點。旋轉可以被認為是將其中的乙個子段旋轉180度,這意味著子段的第一張牌和最後一張牌交換位置,以及第二張牌和倒數第二張牌交換位置,等等。寫乙個程式,...

BJ模擬(1) D2T3 鏈上求和

鏈上求和 題目背景 分析 這個題,我真的很想呵呵,當時聽滿分神犇講了一次,然後學長講了一次,然後默默的自己看了 n次,然後在給別人講了兩次,才終於算是基本懂了 現在讓我寫,恐怕還是只有呵呵 我們先一步步進行考慮,首先對於一條鏈上的某乙個點,他在這一條鏈上的統計次數,是這條鏈上比它的權值小的點的個數加...

BJ模擬(2) D2T3 路徑規劃

路徑規劃 題目背景 thoj27 分析 這道題我打了乙個暴力,用樹鏈剖分實現不知道為什麼前兩個點都沒有過,但是別人完全不優化的暴力竟然都過了,這樣我很不服啊,不開心 qnq,本來呢,這道題敲乙個無腦的點分是可以卡卡常數過的,複雜度 o nlog2n 但是正如某學長所說,這樣非常的不優雅,那我們考慮一...