题目大意:
给出
n
段长的为整数
分析:
要加高精度。
AC code:
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <string>
#include <sstream>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <queue>
#include <vector>
#define pb push_back
#define mp make_pair
typedef long long LL;
typedef double DB;
typedef long double LD;
using namespace std;
const int MAXN = 259;
const int MAXL = 209;
const int mod = 10000;
int n, k;
int a[MAXN];
struct BigNum
{
int len;
int a[MAXL];
BigNum()
{
len = 1;
memset(a, 0, sizeof a);
}
void init(int x) {a[len = 1] = x;}
void shift()
{
for(int i = 1; i <= len; ++i)
{
a[i+1] += a[i]/mod;
a[i] %= mod;
}
while(a[len+1])
{
len++;
a[len+1] += a[len]/mod;
a[len] %= mod;
}
while(!a[len] && len) len--;
if(!len) len = 1;
}
friend BigNum operator + (const BigNum &a, const BigNum &b)
{
BigNum ret;
int maxl = max(a.len, b.len);
for(int i = 1; i <= maxl; ++i)
ret.a[i] += a.a[i]+b.a[i];
ret.len = maxl;
ret.shift();
return ret;
}
friend BigNum operator * (const BigNum &a, int k)
{
BigNum ret = a;
for(int i = 1; i <= ret.len; ++i)
ret.a[i] *= k;
ret.shift();
return ret;
}
void print()
{
printf("%d", a[len]);
for(int i = len-1; i >= 1; --i)
printf("%04d", a[i]);
}
};
BigNum f[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; ++i)
scanf("%d", a+i);
sort(a+1, a+n+1);
for(int i = 0; i <= n; ++i) f[0].init(1);
for(int i = 1; i <= n; ++i)
for(int j = a[i]+1; j >= 1; --j)
f[j] = f[j]+f[j-1]*(a[i]-j+1);
f[k].print();
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}