簡單粗暴的題目
題目背景:
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 但是正如某學長所說,這樣非常的不優雅,那我們考慮一...