基本上是组合数裸题。。
给出$(x_1+x_2+x_3….x_k)^n$,要求计算$x_1^{n_1}x_2^{n_2}…x_k^{n_k}$的系数。
思想就是从一个算式中取出$n_k$,即$C_n^{n_k}$,然后减去$n_k$,如果直接相乘则会重复。
#include <bits/stdc++.h> using namespace std; // 大数,内存处理 #define INF 0x3f3f3f3f #define ll long long int #define MEM(a) memset(a, 0, sizeof(a)) #define MEMM(a) memset(a, -1, sizeof(a)) #define DEB(x, n) cout << (x) << " " << (n) << endl #define FOR(i, s, e) for(int (i) = (s); (i) < (e); (i)++) const double PI = acos(-1.0); #define CR printf("\n") // 调试用 template <class Type> void debug(Type a[], int len) { for(int i = ; i < len ; i++) { cout << a[i] << " "; } cout << endl; } const int maxn = 15; int a[maxn]; int C[maxn][maxn]; void init() { for(int i = ; i < maxn; i++) { C[i][] = C[i][i] = 1; for(int j = 1; j < i; j++) C[i][j] = C[i-1][j] + C[i-1][j-1]; } } int main() { #ifdef DEBUG // freopen("input", "r", stdin); //从input文件中读入 // freopen("output", "w", stdout); //输出到output文件 #endif int n, k; init(); while(~scanf("%d%d", &n, &k)) { for(int i = ; i < k;i ++) scanf("%d", &a[i]); int ans = 1; for(int i = ; i < k; i++) { ans *= C[n][a[i]]; n -= a[i]; } printf("%d\n", ans); } return ; }