要求二項式的冪的某個係數的話,到了初中就應該會知道可以用 楊輝三角 這個東西來求係數。舉幾個例子吧:
112根據這兩個例子就能看出:楊輝三角的第 n 行對應的就是 (a+b)的 n-1 次方的各項係數。再看楊輝三角的規律:每一項都是這一項歲對應的上面兩個數的和,所以我們可以列印楊輝三角,在做些運算就可以a掉這個題啦。1131
21 (a+b)^2=a^2+2ab+b^241
331 (a+b)^3=a^3+3ba^2+3ab^2+b^351
4641
…… 61
510105
1 ……
先說怎麼求楊輝三角,一般都是定義乙個二維陣列,假設為 a;根據楊輝三角的規律,可以得到乙個遞推式:
a[i][j]=a[i-1][j-1]+a[i-1][j];
不要忘了先將 a[1][1]賦值為 1
**:
1 a[1][1]=1;2注意:i 要從2開始迴圈,因為 a[1][1]已經賦值了,如 i 從1開始的話,a[1][1]會被重新賦值為0,這樣列印出來就都是0;for(int i=2;i<=k+1;++i) // k是(a+b)的次數
38 }
雖然這種列印楊輝三角的方法沒有任何問題,但是看資料範圍:
k≤10000,這樣的話就陣列就至少要開 a[10000][10000];而且僅是 int 型別的話這個二維陣列所佔記憶體為:10000×10000×4÷1024÷1024≈381.47mb;
將近是記憶體限制的3倍,這肯定不行,所以就有了另一種記憶體占用比較少的方法:既然我們只需要楊輝三角的第 k+1 行,所以我們可以定義乙個一維陣列來儲存 k=1時的數,推出 k=2時的數後,再將這個一維陣列更新,這樣不斷更新來減少記憶體;
**:
1 a[1]=1定義了兩個陣列,a[10010] 和 b[10010],a來儲存當前的數值,b來儲存上一次的數值,用來遞推。所以最終a陣列儲存的就是(a+b)^k的每項係數。; // 依舊要賦值為1
2 b[1]=1
; // 同上
3for(int i=2;i<=k+1;++i) // i代表 當(a+b)為 i 次方時49
for(int j=2;j<=i+1;++j) // 將本次迴圈所更新後的數儲存,以便下一次的遞推
1013 }
(a+b)^k的係數求出來後,不要忘了題目中要求求的是(by+ax)^k展開後 x^n*y^m項的係數。這個係數其實就是b^m*a^n*a[m+1]或者是b^m*a^n*a[n+1];
完整**:
1 #include2using
namespace
std;
3long
long a[10010];4
long
long b[10010];5
const
long
long mod=10007
;// 要求對10007取餘
6int
main()
717 a1%=mod,b1%=mod;
18 a2=a1,b2=b1;
19for(int i=2;i<=k+1;++i)
2026
for(int j=2;j<=i+1;++j)
2730}31
for(int i=2;i<=n;++i)
3236
for(int i=2;i<=m;++i)
3741
long
long ans=((a[m+1]*a1)%mod*b1)%mod;
42 cout<
43return0;
44 }
洛谷 P1313 計算係數
題目描述 給定乙個多項式 by ax k,請求出多項式展開後x n y m 項的係數。輸入輸出格式 輸入格式 輸入檔名為factor.in。共一行,包含5 個整數,分別為 a b k n m,每兩個整數之間用乙個空格隔開。輸出格式 輸出共1 行,包含乙個整數,表示所求的係數,這個係數可能很大,輸出對...
洛谷 P1313 計算係數
題目描述 給定乙個多項式 by ax k,請求出多項式展開後x n y m 項的係數。輸入輸出格式 輸入格式 輸入檔名為factor.in。共一行,包含5 個整數,分別為 a b k n m,每兩個整數之間用乙個空格隔開。輸出格式 輸出共1 行,包含乙個整數,表示所求的係數,這個係數可能很大,輸出對...
洛谷 P1313 計算係數
題目描述 給定乙個多項式 by ax k,請求出多項式展開後x n y m 項的係數。輸入格式 輸入檔名為factor.in。共一行,包含5 個整數,分別為 a b k n m,每兩個整數之間用乙個空格隔開。輸出格式 輸出共1 行,包含乙個整數,表示所求的係數,這個係數可能很大,輸出對10007 取...