Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- #ifdef _WIN32
- #define LLD "%I64d"
- #else
- #define LLD "%lld"
- #endif
- long long rdtsc() {
- long long tmp;
- asm("rdtsc" : "=A"(tmp));
- return tmp;
- }
- int rnd(int x) {
- return rand() % x;
- }
- #define eprintf(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
- #define sz(a) ((int) (a).size())
- #define pb push_back
- #define mp make_pair
- #define TASK "text"
- const ld EPS = 1e-9;
- const int INF = 1.01e9;
- const ld PI = acos(-1.0L);
- void precalc() {
- }
- const int MOD = (int) 1e9 + 7;
- const int maxn = (int) 1e3 + 100;
- int add(int a, int b) {
- int ans = a + b;
- if (ans >= MOD) {
- ans -= MOD;
- }
- return ans;
- }
- int mult(int a, int b) {
- return (ll) a * b % MOD;
- }
- int power(int a, int p) {
- int ans = 1;
- while (p > 0) {
- if (p & 1) {
- ans = mult(ans, a);
- }
- a = mult(a, a);
- p >>= 1;
- }
- return ans;
- }
- int n, k;
- int p[maxn];
- int fenv[2][maxn][maxn];
- void addfenv(int * f, int i, int a) {
- for (; i <= n; i += (i & (-i))) {
- f[i] = add(f[i], a);
- }
- }
- int getfenv(int * f, int i) {
- int ans = 0;
- for (; i > 0; i -= (i & (-i))) {
- ans = add(ans, f[i]);
- }
- return ans;
- }
- void build() {
- for (int i = 0; i < n + 10; i++) {
- for (int j = 0; j < n + 10; j++) {
- fenv[0][i][j] = fenv[1][i][j] = 0;
- }
- }
- }
- bool read() {
- if (scanf("%d%d", &n, &k) < 1) {
- return false;
- }
- for (int i = 0; i < n; i++) {
- scanf("%d", p + i);
- }
- return true;
- }
- int inv[2][maxn];
- int tmp[2][maxn];
- void solve() {
- if (n == 1) {
- printf("0\n");
- return;
- }
- build();
- memset(inv, 0, sizeof(inv));
- for (int i = n - 2; i >= 0; i--) {
- for (int j = 0; j < 2; j++) {
- inv[j][i] = inv[j][i + 1] + ((p[i] > p[i + 1]) ^ j);
- }
- }
- addfenv(fenv[1][inv[1][1] + (p[0] < p[1])], p[0], 2);
- addfenv(fenv[0][inv[0][1] + (p[0] > p[1])], p[0], 2);
- for (int k = 2; k < n; k++) {
- memset(tmp, 0, sizeof(tmp));
- for (int t = 0; t < 2; t++) {
- for (int i = 0; i < n; i++) {
- int j = i + inv[t ^ 1][k - 1] - t - inv[t][k];
- if (j >= 0 && j < n) {
- tmp[t][i] = add(tmp[t][i], getfenv(fenv[t ^ 1][j], p[k]));
- }
- j = i + inv[t ^ 1][k - 1] - 1 + t - inv[t][k];
- if (j >= 0 && j < n) {
- tmp[t][i] = add(tmp[t][i], add(getfenv(fenv[t ^ 1][j], n), MOD - getfenv(fenv[t ^ 1][j], p[k])));
- }
- }
- }
- for (int t = 0; t < 2; t++) {
- for (int i = 0; i < n; i++) {
- addfenv(fenv[t][i], p[k - 1], tmp[t][i]);
- }
- }
- }
- int ans = 0;
- for (int t = 0; t < 2; t++) {
- for (int i = 0; i < n; i++) {
- ans = add(ans, mult(power(i, k), getfenv(fenv[t][i], n)));
- }
- }
- printf("%d\n", ans);
- }
- int main() {
- srand(rdtsc());
- #ifdef DEBUG
- assert(freopen(TASK ".out", "w", stdout));
- assert(freopen(TASK ".in", "r", stdin));
- #endif
- precalc();
- while (true) {
- if (!read()) {
- break;
- }
- solve();
- #ifdef DEBUG
- eprintf("Time %.3f\n", (double) clock() / CLOCKS_PER_SEC);
- #endif
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement