Advertisement
Guest User

Untitled

a guest
Feb 9th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef long double ld;
  7.  
  8. #ifdef _WIN32
  9. #define LLD "%I64d"
  10. #else
  11. #define LLD "%lld"
  12. #endif
  13.  
  14. long long rdtsc() {
  15.   long long tmp;
  16.   asm("rdtsc" : "=A"(tmp));
  17.   return tmp;
  18. }
  19.  
  20. int rnd(int x) {
  21.   return rand() % x;
  22. }
  23.  
  24. #define eprintf(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
  25. #define sz(a) ((int) (a).size())
  26. #define pb push_back
  27. #define mp make_pair
  28. #define TASK "text"
  29.  
  30. const ld EPS = 1e-9;
  31. const int INF = 1.01e9;
  32.  
  33. const ld PI = acos(-1.0L);
  34.  
  35. void precalc() {
  36. }
  37.  
  38. const int MOD = (int) 1e9 + 7;
  39. const int maxn = (int) 1e3 + 100;
  40.  
  41. int add(int a, int b) {
  42.   int ans = a + b;
  43.   if (ans >= MOD) {
  44.     ans -= MOD;
  45.   }
  46.   return ans;
  47. }
  48.  
  49. int mult(int a, int b) {
  50.   return (ll) a * b % MOD;
  51. }
  52.  
  53. int power(int a, int p) {
  54.   int ans = 1;
  55.   while (p > 0) {
  56.     if (p & 1) {
  57.       ans = mult(ans, a);
  58.     }
  59.     a = mult(a, a);
  60.     p >>= 1;
  61.   }
  62.   return ans;
  63. }
  64.  
  65. int n, k;
  66. int p[maxn];
  67. int fenv[2][maxn][maxn];
  68.  
  69. void addfenv(int * f, int i, int a) {
  70.   for (; i <= n; i += (i & (-i))) {
  71.     f[i] = add(f[i], a);
  72.   }
  73. }
  74.  
  75. int getfenv(int * f, int i) {
  76.   int ans = 0;
  77.   for (; i > 0; i -= (i & (-i))) {
  78.     ans = add(ans, f[i]);
  79.   }
  80.   return ans;
  81. }
  82.  
  83. void build() {
  84.   for (int i = 0; i < n + 10; i++) {
  85.     for (int j = 0; j < n + 10; j++) {
  86.       fenv[0][i][j] = fenv[1][i][j] = 0;
  87.     }
  88.   }
  89. }
  90.  
  91. bool read() {
  92.   if (scanf("%d%d", &n, &k) < 1) {
  93.     return false;
  94.   }
  95.  
  96.   for (int i = 0; i < n; i++) {
  97.     scanf("%d", p + i);
  98.   }
  99.  
  100.   return true;
  101. }
  102.  
  103. int inv[2][maxn];
  104. int tmp[2][maxn];
  105.  
  106. void solve() {
  107.   if (n == 1) {
  108.     printf("0\n");
  109.     return;
  110.   }
  111.   build();
  112.   memset(inv, 0, sizeof(inv));
  113.   for (int i = n - 2; i >= 0; i--) {
  114.     for (int j = 0; j < 2; j++) {
  115.       inv[j][i] = inv[j][i + 1] + ((p[i] > p[i + 1]) ^ j);
  116.     }
  117.   }
  118.   addfenv(fenv[1][inv[1][1] + (p[0] < p[1])], p[0], 2);
  119.   addfenv(fenv[0][inv[0][1] + (p[0] > p[1])], p[0], 2);
  120.   for (int k = 2; k < n; k++) {
  121.     memset(tmp, 0, sizeof(tmp));
  122.     for (int t = 0; t < 2; t++) {
  123.       for (int i = 0; i < n; i++) {
  124.         int j = i + inv[t ^ 1][k - 1] - t - inv[t][k];
  125.         if (j >= 0 && j < n) {
  126.           tmp[t][i] = add(tmp[t][i], getfenv(fenv[t ^ 1][j], p[k]));
  127.         }
  128.         j = i + inv[t ^ 1][k - 1] - 1 + t - inv[t][k];
  129.         if (j >= 0 && j < n) {
  130.           tmp[t][i] = add(tmp[t][i], add(getfenv(fenv[t ^ 1][j], n), MOD - getfenv(fenv[t ^ 1][j], p[k])));
  131.         }
  132.       }
  133.     }
  134.     for (int t = 0; t < 2; t++) {
  135.       for (int i = 0; i < n; i++) {
  136.         addfenv(fenv[t][i], p[k - 1], tmp[t][i]);
  137.       }
  138.     }
  139.   }
  140.   int ans = 0;
  141.   for (int t = 0; t < 2; t++) {
  142.     for (int i = 0; i < n; i++) {
  143.       ans = add(ans, mult(power(i, k), getfenv(fenv[t][i], n)));
  144.     }
  145.   }
  146.   printf("%d\n", ans);
  147. }
  148.  
  149. int main() {
  150.   srand(rdtsc());
  151. #ifdef DEBUG
  152.   assert(freopen(TASK ".out", "w", stdout));
  153.   assert(freopen(TASK ".in", "r", stdin));
  154. #endif
  155.  
  156.   precalc();
  157.   while (true) {
  158.     if (!read()) {
  159.       break;
  160.     }
  161.     solve();
  162. #ifdef DEBUG
  163.     eprintf("Time %.3f\n", (double) clock() / CLOCKS_PER_SEC);
  164. #endif
  165.   }
  166.  
  167.   return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement