Submission #9462123
Source Code Expand
#include <iostream>
#include <vector>
#include <array>
#include <list>
#include <queue>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <string>
#include <sstream>
#include <algorithm>
#include <random>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cmath>
#include <cassert>
#include <climits>
#include <bitset>
#include <functional>
#include <iomanip>
#define FOR_LT(i, beg, end) for (int i = beg; i < end; i++)
#define FOR_LE(i, beg, end) for (int i = beg; i <= end; i++)
#define FOR_DW(i, beg, end) for (int i = beg; end <= i; i--)
using namespace std;
int64_t pow_rem(int64_t x, int64_t m, int64_t rem)
{
if (m == 0) {
return 1;
}
if (m == 1) {
return x;
}
if (m & 1) {
int64_t val = pow_rem(x, m / 2, rem);
val = val * val;
val %= rem;
val *= x;
val %= rem;
return val;
}
else {
int64_t val = pow_rem(x, m / 2, rem);
val = val * val;
val %= rem;
return val;
}
}
int64_t pow_remdiv(int64_t val, int64_t rem)
{
return pow_rem(val, rem - 2, rem);
}
int64_t divide_rem(int64_t divident, int64_t dividor, int64_t rem)
{
int64_t ret = pow_remdiv(dividor, rem);
ret *= divident;
ret %= rem;
return ret;
}
vector<int64_t> factors;
vector<int64_t> finvs;
void precalc_nCr(int n, int64_t rem) {
factors = vector<int64_t>(n + 1);
finvs = vector<int64_t>(n + 1);
{
int64_t f = 1;
factors[0] = 1;
FOR_LE(i, 1, n) {
f *= i;
f %= rem;
factors[i] = f;
}
}
{
int64_t inv = divide_rem(1, factors[n], rem);
finvs[n] = inv;
FOR_DW(i, n - 1, 0) {
inv *= i + 1;
inv %= rem;
finvs[i] = inv;
}
}
}
int64_t nCr_postcalc(int n, int k, int64_t rem) {
int64_t val = factors[n];
val *= finvs[n - k];
val %= rem;
val *= finvs[k];
val %= rem;
return val;
}
int64_t kRem = 1000000007;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout << fixed << setprecision(20);
int n; int k; cin >> n >> k;
vector<int64_t> as(n);
FOR_LT(i, 0, n) {
cin >> as[i];
}
sort(as.begin(), as.end());
int64_t maxs = 0;
int64_t mins = 0;
precalc_nCr(n, kRem);
FOR_LT(i, 0, n - k + 1) {
int64_t ncr = nCr_postcalc(n - i - 1, k - 1, kRem);
int64_t maxv = ncr * as[n - 1 - i];
maxv %= kRem;
int64_t minv = ncr * as[i];
minv %= kRem;
maxs += maxv;
maxs %= kRem;
mins += minv;
mins %= kRem;
}
int64_t ans = maxs - mins;
ans %= kRem;
if (ans < 0) ans += kRem;
cout << ans << endl;
return 0;
}
Submission Info
| Submission Time |
|
| Task |
E - Max-Min Sums |
| User |
cplusplusonly |
| Language |
C++14 (GCC 5.4.1) |
| Score |
500 |
| Code Size |
2640 Byte |
| Status |
AC |
| Exec Time |
24 ms |
| Memory |
2560 KiB |
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
500 / 500 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
sample_01, sample_02, sample_03, sample_04 |
| All |
max_01, max_02, max_03, max_04, random_01, random_02, random_03, random_04, random_05, random_06, random_07, random_08, random_09, random_10, sample_01, sample_02, sample_03, sample_04 |
| Case Name |
Status |
Exec Time |
Memory |
| max_01 |
AC |
23 ms |
2560 KiB |
| max_02 |
AC |
23 ms |
2560 KiB |
| max_03 |
AC |
23 ms |
2560 KiB |
| max_04 |
AC |
23 ms |
2560 KiB |
| random_01 |
AC |
16 ms |
1664 KiB |
| random_02 |
AC |
3 ms |
512 KiB |
| random_03 |
AC |
24 ms |
2432 KiB |
| random_04 |
AC |
22 ms |
2304 KiB |
| random_05 |
AC |
16 ms |
1792 KiB |
| random_06 |
AC |
3 ms |
512 KiB |
| random_07 |
AC |
3 ms |
384 KiB |
| random_08 |
AC |
2 ms |
256 KiB |
| random_09 |
AC |
12 ms |
1408 KiB |
| random_10 |
AC |
6 ms |
768 KiB |
| sample_01 |
AC |
1 ms |
256 KiB |
| sample_02 |
AC |
1 ms |
256 KiB |
| sample_03 |
AC |
1 ms |
256 KiB |
| sample_04 |
AC |
1 ms |
256 KiB |