洛谷 P1313 計算係數

2022-02-19 05:54:01 字數 2132 閱讀 6451

要求二項式的冪的某個係數的話,到了初中就應該會知道可以用 楊輝三角 這個東西來求係數。舉幾個例子吧:

112

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 ……

根據這兩個例子就能看出:楊輝三角的第 n 行對應的就是 (a+b)的 n-1 次方的各項係數。再看楊輝三角的規律:每一項都是這一項歲對應的上面兩個數的和,所以我們可以列印楊輝三角,在做些運算就可以a掉這個題啦。

先說怎麼求楊輝三角,一般都是定義乙個二維陣列,假設為 a;根據楊輝三角的規律,可以得到乙個遞推式:

a[i][j]=a[i-1][j-1]+a[i-1][j];

不要忘了先將 a[1][1]賦值為 1

**:

1     a[1][1]=1;2

for(int i=2;i<=k+1;++i) // k是(a+b)的次數

38 }

注意:i 要從2開始迴圈,因為 a[1][1]已經賦值了,如 i 從1開始的話,a[1][1]會被重新賦值為0,這樣列印出來就都是0;

雖然這種列印楊輝三角的方法沒有任何問題,但是看資料範圍:

k≤10000,這樣的話就陣列就至少要開 a[10000][10000];而且僅是 int 型別的話這個二維陣列所佔記憶體為:10000×10000×4÷1024÷1024≈381.47mb;

將近是記憶體限制的3倍,這肯定不行,所以就有了另一種記憶體占用比較少的方法:既然我們只需要楊輝三角的第 k+1 行,所以我們可以定義乙個一維陣列來儲存 k=1時的數,推出 k=2時的數後,再將這個一維陣列更新,這樣不斷更新來減少記憶體;

**:

1     a[1]=1

; // 依舊要賦值為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[10010] 和 b[10010],a來儲存當前的數值,b來儲存上一次的數值,用來遞推。所以最終a陣列儲存的就是(a+b)^k的每項係數。

(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 #include2

using

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 取...