題目鏈結
題目大意: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...