關於二項式定理

關於二項式定理:

感謝\(lfd\)ios

定理內容:

\((a+b)^n=C_n^0*a^n*b^0+C_n^1*a^{n-1}*b^1+......C_n^n*a^0*b^n\)
也就是\((a+b)^n=\Sigma _{k=0}^nC_n^ka^kb^{n-k}\)
通項公式:\(T_{r+1}=C_n^r*a^{n-r}*b^r\) \((r\in [0,n])\)
解釋一下各字母的含義:
\(T[r+1]:\)表示第\(r+1\)項是什麼
\(C_n^r:\)他只是個單純的組合數而已
\(a^{n-r}:\) 由於\(a\)是未知數,因此這個\(n-r\)就表明第\(r+1\)項時的\(a\)的次數是\(n-r\)
\(b^r\)同上
例題:
洛谷p1313計算係數git

很明顯的二項式定理的應用
須要注意一下的是其實因爲\(x 、 y\)都是有係數的,因此還要把他們的係數也算出來,次數與\(x、y\)的保持一致
Code:spa

#include <cstdio>
#include <iostream>
#define int long long
using namespace std;
const int mo = 10007;
int c[1005][1005], ans, a, b, k, n, m;
int read() {
    int s = 0, w = 1;
    char ch = getchar();
    while(!isdigit(ch)) {if(ch == '-') w = -1; ch = getchar();}
    while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = getchar();}
    return s * w;
}
int power(int x, int y) {
    int sum = 1;
    while(y) {
        if(y & 1) sum = (sum * x) % mo;
        x = (x * x) % mo;
        y >>= 1;
    }
    return sum;
}
int find(int n, int m) {
    if(!m) return c[n][m] = 1;
    if(m == 1) return c[n][m] = n;
    if(c[n][m]) return c[n][m];
    if(n - m < m) m = n - m;
    return c[n][m] = (find(n - 1, m) + find(n - 1, m - 1)) % mo;    
}
signed main() {
    a = read(), b = read(), k = read(), n = read(), m = read();
    c[1][0] = c[1][1] = ans = 1;
    a %= mo, b %= mo;
    ans *= (power(a, n) * power(b, m)) % mo;
    if(n > m) n = m;
    ans = (ans * find(k, n) % mo) % mo;
    printf("%lld\n", ans);
    return 0;
}

謝謝收看, 祝身體健康!code

相關文章
相關標籤/搜索