前言:
「所有的組合數問題都是好題」
————清華某高材生zhx
組合數問題在近幾年的noip的考試中多次露面,感覺有必要好好學一學
組合數的常見公式:
題目:
計算係數
noip2011提高組day2第1題
輸入樣例:
1 1 3 1 2輸出樣例:
3規定(a+b)^k k為指數
1 、 二項式的係數就與楊輝三角有關,即與組合數有關
2、 k為幾,就代表是楊輝三角的第幾行
3、我們將上述二項式展開後可發現: 越往後的每一項,a的指數是在遞減的,而b的指數是在增加的 , 例如:第一項a的指數是k,b的指數是0 ,最後一項a的指數是0,b的指數是k
4、 拓展:根據展開式可發現,二項式的係數是對稱的
思路講解:
我們已知上述資訊之後便可輕鬆解決本題啦
1、二項式的指數是k,根據上面的資訊2可知,答案在楊輝三角的第k行
2、根據上述資訊4可知,我們求的是楊輝三角的第k行的第m項或者是第n項(對稱性)
3、此題與原始組合數不同的是:我們需要在係數上乘上 a 的 最終的值,再乘上 b 最終的值
我們可以思考:如果我們將 a 與 x 等同的看作是乙個未知數的話 ,那麼如果 x最終變成x^n , a也應該等同的成為 a ^ n
所以答案就是 a的n次方 乘以 b的m次方 乘以 楊輝三角的第k行,第n項
即 係數最終的答案就是 a^n * b^m * c 【k】【m】
4、對於求解 a^n 和 b^m 我們可以用快速冪 ,但是要注意我們在讀入a,b之後一定要先取一次模,否則我們在快速冪第一次計算 a*a 的時候 會炸掉
#include#includenoip提高組2016#include
using
namespace
std;
int c[1009][1009
];int quick_power(int a,int b ,int
p)
return
ans;
}int
main()
}a=quick_power(a,n,10007
); b=quick_power(b,m,10007
);
cout
<
<
return0;
}
輸入樣例#1:
1 2輸出樣例#1:3 3
1輸入樣例#2:
2 5輸出樣例#2:4 56 7
思路講解
既然上面那題都做完了,這個題也就不難了
這個題是讓你找在不超過它給你的 i 和 j 的範圍之內求組合數 答案是 k 的倍數的數
我們可以先預處理出2000*2000 以內的所有的組合數
但是如果即使這樣預處理了,我們對於每一組測試資料都暴力的去計算一遍有多少對的話,我們可以發現 2000*2000* 10000 是明顯過不掉這道題的
我們觀察一下,我們的k值是一直不變的 ,所以我們可以對於當前的每乙個c( i , j) 我們都可以用字首和求出他之前有多少個 ,如果當前這個數是k的倍數的話(即:c( i, j )%k==0) 我們就把剛求出來的字首和+1就是當前的答案
1 #include2 #include3 #include4最後加一道最簡單的組合數問題練練手吧5using
namespace
std;67
int c[2020][2020];8
int a[2020][2020];9
intt,k;
10void
c()16}17
}181920
2122
intmain()
31 a[i][i+1]=a[i][i];32}
33for(int i=1;i<=t;i++)
39return0;
40 }
end.
NOIP2016 組合數問題
題目描述 第一行有兩個整數t,k,其中t代表該測試點總共有多少組測試資料,k的意義見 問題描述 接下來t行每行兩個整數n,m,其中n,m的意義見 問題描述 t行,每行乙個整數代表答案。輸入樣例 1 1 23 3 輸入樣例 2 2 54 5 6 7 輸出樣例 1 1輸出樣例 2 07 樣例1說明 在所...
NOIP2016組合數問題
題目分析 dp不解釋。首先要來乙個組合數將cnm的值都預處理出來,不過在加起來的時候記得取模。接下來就是二維字首和的事情了。define m 2000 include include include include using namespace std int c m 3 m 3 sum m 3 ...
NOIP2016 組合數問題
題目描述 題目背景 noip2016 提高組 day2 t1 組合數 表示的是從 n 個物品中選出 m 個物品的方案數。舉個例子,從 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定義,我們可以給出計算組合數 的一般公式 1 2 n。小蔥想知道如果給定...