1. 程式人生 > >一種遞推組合數字首和的Trick

一種遞推組合數字首和的Trick

記錄一下一種推組合數字首和的方法 ## Trick 設$\sum_{i = 0}^m C_n^i = S(n, m)$ $S$是可以遞推的 - $S(n, m + 1) = S(n, m) + C_{n}^{m + 1}$ 就是加上最末尾的一項 - $S(n + 1, m) = 2S(n, m) - C_n^m$ $S(n, m)$可以看做是楊輝三角上的一行,而$S(n+1, m)$是他的下一行 考慮組合數的遞推公式,除了$C[n][m]$這一項之外都會被計算兩次、 另外如果有多組詢問的話可以用莫隊實現 ```cpp #include using namespace std; int N, M, Lim, C[1001][1001], S[1001][1001]; int Make1() { for(int i = 0; i <= Lim; i++) { C[i][0] = C[i][i] = 1; for(int j = 1; j < i; j++) C[i][j] = C[i - 1][j - 1] + C[i - 1][j]; } return C[N][M]; } void Make2() { /*for(int i = 0; i <= Lim; i++) { S[i][0] = 1; for(int j = 1; j <= i; j++) S[i][j] = S[i][j - 1] + C[i][j]; }*/ for(int i = 0, base = 1; i <= Lim; i++, base <<= 1) { S[i][i] = base; for(int j = i + 1; j <= Lim; j++) S[j][i] = 2 * S[j - 1][i] - C[j - 1][i]; } } void print(int (*a)[1001]) { for(int i = 0; i <= Lim; i++, puts("")) { for(int j = 0; j <= i; j++) printf("%d ", S[i][j]); } } main() { Lim = 10; //cin >> N >> M; Make1(); Make2(); print(S); } ```

相關推薦

組合數字首Trick

記錄一下一種推組合數字首和的方法 ## Trick 設$\sum_{i = 0}^m C_n^i = S(n, m)$ $S$是可以遞推的 - $S(n, m + 1) = S(n, m) + C_{n}^{m + 1}$ 就是加上最末尾的一項 - $S(n + 1, m)

51nod 1361 有階二次式)

矩陣 個數 bubuko 二次 技術 有一種 這就是 mage 9.png 分析:- - 這就是個數學競賽題啊...遞推式可以這麽求: tn可以用矩陣快速冪求出來,然後用最後一個式子求一下bn再代回去求an就行了。p^2-1不一定是最小周期,但一定是一個周期。51

矩陣快速冪(共軛函式兩式)

題目連結:https://cn.vjudge.net/contest/261339#problem/B AC1:ans= x(n)+y(n)*sqrt(6),所以,ans=x(n)+y(n)*sqrt(6)+(x(n)-y(n)*sqrt(6))-(x(n)-y(n)*sqrt(6))=2*

P1759 通天之潛水(不詳細,勿看)(動態規劃,組合揹包,洛谷)

題目連結:點選進入 題目分析: 簡單的組合揹包模板題,但是遞推的同時要重新整理這種情況使用了哪些物品 ac程式碼: #include<bits/stdc++.h> using namespace std; int weigh[101],zhu[101],t[101]; stru

P1759 通天之潛水(不詳細,勿看)(動態規劃,組合背包,洛谷)

規劃 .org turn 分析 student false number 找到 div 題目鏈接:點擊進入 題目分析: 簡單的組合背包模板題,但是遞推的同時要刷新這種情況使用了哪些物品 ac代碼: #include<bits/stdc++.h> u

“全棧2019”Java第三十章:二維多維組詳解

inf 基礎 公眾號 方式 www 適合 語法 文章 公眾 難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文鏈接 “全棧2019”Java第三十一章:二維數組和多維數組詳

另外獲取redis cluster主從關係slot分佈的方法

  條條大路通羅馬,通過最近學習redis cluster 觀察其輸出,發現了另外一種獲取master-slave關係的方法。   [[email protected] ~]$ cat get_master_slave2.sh redis-cli -h $1 -p

迴計算的高效方法

2013-03-05 周海漢/文 http://abloz.com 遞迴計算,有時能非常直觀的解決問題,但是非常耗資源,計算很慢,還可能導致堆疊耗盡,計算失敗。所以很多時候具體實現時不提倡採用遞迴,而是將遞迴轉為迴圈的方式來實現

比較好的JNI JavaC++相互傳遞引數返回值的方法

序言 以前在Android上做移動多媒體開發的時候,有很多需要在Java和C++相互傳遞引數的Case,以前因為時間卡的緊,一直沒有去修復這一類的問題,因為能用,沒有出什麼問題,也就沒有想什麼優化方案。最近自己有一些閒暇時間折騰點小玩意兒,也需要從Java和C++之間相互傳遞引數。想

python開發平臺PyCharm最好的編輯環境配置(字型大小顏色)

  python 的開發平臺PyCharm是一款非常人性化的IDE,得到非常多pythone開發者的認可和使用。下面分享一款個人非常喜愛的使用環境配置,如圖所示:   當然,你也可以有自己喜歡

從一道騰訊演算法題到迴形式

演算法題目: 12個高矮不同的人排兩行,一行六人,在保證每行從左到右依次增高,每列從前到後依次增高的前提下,一共有多少種排法? 思路: 我們用陣列來表示這兩排人: 假設高矮不同的12個人我們分別用0~11來表示。 通過簡單的思考,我們可以斷定:前排的最左邊應該為0,後排的

為什麼MVC不是設計模式? ---比較BackboneExt4.x在MVC實現上的差異

為什麼MVC不是一種設計模式? ---比較Backbone和Ext4.x在MVC實現上的差異 轉載:http://damoqiongqiu.iteye.com/blog/1949256 大漠窮秋 前言 聖人云:不想做媽咪的小姐不是好碼農。 每一個碼

淺談 特徵方程(二階常係數線性齊次式的應用證明)

轉自我兒lzj之部落格 PS:我學這個的時候,應用其實是非常簡單的,先把x1和x2求出來,然後把已知的序列中的某兩項帶入求出A和B的值,那麼通項公式就求出來嘞。 雖然證明看起來式子很多,但其實認真讀一下就好啦。 前言 特徵方程應該是大學裡的內容,但最近做題的時候

caioj1063·動態規劃入門(維一邊1:美元馬克)

1063:動態規劃入門(一維一邊推1:美元和馬克) 時間限制: 1 Sec 記憶體限制: 128 MB 題目描述 【問題描述】 今天6:00起床,我轉身發現枕頭邊有100美元。 出門的時候發現門口有家冰淇淋店,拉了很長的橫幅:“今天100美元和4

動態寫入apk據的方法(用於用戶關系綁定、添加渠道號等)

val 遇到的問題 sig 無法 暫時 lac exception 每一個 tof 背景: 正在開發的APP需要記錄業務員與客戶的綁定關系。具體應用場景如下: 由流程圖可知,並沒有用戶填寫業務人員信息這一步,因此在用戶下載的APP中就已經攜帶了業務人員的信息。 由

你需要精通監控-常用行詳解

1 獲取網絡卡1m每秒流量平均(此時是有多少網絡卡將會顯示多少網絡卡的流量) 表示式 rate(node_network_receive_bytes_total[1m]) 2)只看eth0網絡卡1m每秒流量平均(即所有伺服器eth0) 表示式 rate(node_network_receiv

C++異常機制的實現方式開銷分析 (大圖,編譯器會為每個函增加EHDL結構,組成一個單向鏈表,非常著名的“內存訪問違例”出錯對話框就是該機制的體現)

執行 對話框 這也 很多 包括 一個棧 簡單 tid 一點 白楊 http://baiy.cn   在我幾年前開始寫《C++編碼規範與指導》一文時,就已經規劃著要加入這樣一篇討論 C++ 異常機制的文章了。沒想到時隔幾年以後才有機會把這個尾巴補完 :-)。 還

據結構()-----4方法求最大子列

include iss 需要 中間 () log 完整 font sso 數據結構(一)-----4種方法求最大子列和 1、暴力算法 /* 作者:mys 功能:求最大子列和 日期:2018/7/23 */ #include<stdio.h> #include&l

由DAG到背包問題——記憶化搜索解法

必須 結果 stream size 遞推 algo main style 得到 一、問題描述 物品無限的背包問題:有n種物品,每種均有無窮多個。第 i 種物品的體積為Vi,重量為Wi。選一些物品裝到一個容量為 C 的背包中,求使得背包內物品總體積不超過C的前提下重量的最大值

用c語言輸出菱形,水仙花求和

1.在螢幕上輸出一個菱形 上半段以中間數middle為中心,向左向右依次擴開,注意字串帶有‘\0’,所以要除二減一才是中間數。 //打印出一個菱形 #include <stdio.h> #include <stdlib.h> #define Breadth 8//