T137223 節能主義

2022-03-02 10:11:19 字數 1435 閱讀 6899

設平均數為$x$,那麼有差值陣列$b_i=a_i-x$。

考慮用類似於均分紙牌的方法來解決本題,從左到右依次考慮每堆書,直接乘上預處理好的組合數,然後清零$b_i$。

在實際操作中,將冗餘的操作忽略,肯定是由大書堆向小書堆的方向移動,並且每對相鄰位置的移動方向是確定的。

所以我們可以一遍掃過去,如果當前這堆書多了,就往後移;要是不夠,就從後面拿過來。每次使當前位置達到平均值,並且將富餘/缺口推給下乙個位置。

要是後面也不夠填補當前位置的缺口呢?我們可以想到,在實際操作中,書一定會先從更後面傳遞過來,而到了恰好下乙個位置時,下乙個位置多出來的書一定會是剛好填補當前位置的缺口的。所以在這一步計算方案數時,就可以直接使用「下個位置的書總數是平均數加上當前位置的缺口量」這樣的狀態。不過「推缺口」操作還是一樣的。

具體地說,考慮$b_i$:

若$b_i>0$,則將第$i$堆中超出的所有書移到第$i+1$堆,方案數為$\dbinom$。

若$b_i<0$,則將第$i+1$堆中取出$-b_i$移到第$i$堆。若第$i+1$堆當前足夠多,方案數為$\dbinom}$;若不夠多,方案數為$\dbinom$。

核心的貪心思想如上。接下來解決組合數的問題。

當$k\le 4\times 10^3$時,可以使用楊輝三角預處理組合數,時間複雜度為$o(k^2)-o(tn)$;當$k\le 10^6$時,預處理階乘及其乘法逆元,時間複雜度$o(k)-o(tn)$。

**:

#include#include

#include

#include

#include

#define il inline

#define rg register

using

namespace

std;

typedef

long

long

ll;const

int n=1e3;

const

int m=1e6;

#define ri rg int

#define rc rg char

#define rl rg ll

const ll mod=998244353

;il

void qr(ri &x)

il void qw(rl &x,rc ch)

intt,n;

int a[n+3],b[n+3

]; ll jc[m+3],jv[m+3

];il ll qpow(rl a,rl b)

il ll c(ri n,ri m)

il void

init()

il void

sol()

else

if(b[i]<0

) qw(ans,'\n

');}int

main()

view code

T139631 T3 階乘之和

給定乙個非負整數 n,請你判斷 n 是否可以由一些非負整數的階乘相加得到。有若干組資料。每行乙個整數 n,保證 n 1000000。以負數結束輸入。對於每組資料輸出一行,若可以則輸出 yes 否則輸出 no 輸入 1複製 9 1 輸出 1複製 yes7 20 校內測模擬t3 差點就離 l 開 k i...

使用t2t來編寫文件

txt2tags 示例 zh sample zh.html 看這個就能很快熟悉相關語法了 教程 zh manpage zh.html txt2tags學習 bluefrog bluefrog.wu gmail.com date m d y encoding utf 8 target html 一級標...

t073 t015 魔法物品

time limit 1 second memory limit 128 mb 有兩種型別的物品 普通物品和魔法物品。每種普通物品有乙個價值p,但每種魔法物品有兩種價值 鑑定前的價值p1和鑑定後的 價值p2 保證p2 p1 為了鑑定乙個魔法物品,你需要購買乙個鑑定卷軸。鑑定完一件魔法物品以後,鑑定卷...