設平均數為$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#includeview code#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()
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 為了鑑定乙個魔法物品,你需要購買乙個鑑定卷軸。鑑定完一件魔法物品以後,鑑定卷...