2111 ZJOI2010 Perm 排列計數

2021-08-03 04:14:09 字數 682 閱讀 8687

題目鏈結

題目大意:magic數列當且僅當2<=i<=n時,pi>pi/2,求magic數列數量

題解:第一項為1,把i的兩個兒子看做i*2和i*2+1,這樣就形成了一顆以1為根的有根樹,然後按照小根堆填就好了,變成求堆的數量 f[

i]=c

(s[i

]−1,

s[l]

)∗f[

l]∗f

[r]

notice:這個p是輸入的,可能n>p導致p|n從而np不互質,求組合數不能直接用逆元,要用lucas定理

我的收穫:逆元,逆元……

#include 

#include

#include

#include

using

namespace

std;

#define m 1001001

typedef

long

long ll;

ll n,p,size[m<<1],f[m];

ll fac[m]=,i[m]=,inv[m]=;

void linear_shaker()

}ll c(ll x,ll y)

void work()

cout

<1]int main()

ZJOI2010 數字計數

題目描述 給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次。輸入格式 輸入檔案中僅包含一行兩個整數a b,含義如上所述。輸出格式 輸出檔案中包含一行10個整數,分別表示0 9在 a,b 現了多少次。輸入輸出樣例 輸入 1 1 99 輸出 1 9 20 20 2...

ZJOI2010 數字計數

這道題題意清晰明了。最好的方法用字首差求,即 0,b 0,a 1 首先拆位把每位存到陣列中,並求出位數 l 然後把這些數當成 l 位進行統計,不足 l 位的先補字首 0 最後減去多餘的字首 0 即可。下面求 0,a 各個數出現次數的方法大體是 例如 0,1320 1320 中 l 為 4 第一位為 ...

ZJOI2010 基站選址

洛谷題目鏈結 真毒瘤 這個題目耗了我半天。結果是線段樹打錯了。回歸正題 線段樹 dp 首先當然是先考慮樸素 dp 啦,相信你既然都來做這題了,樸素的方程自然不用我多說,設 f i j 表示在前 i 個村莊內,第 j 個基站建在 i 處的最小費用 不考慮 i n 的賠償費用等 方程為 f i j mi...