感謝\(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