《如 何 速 通 一 套 题》4.0

A sprial

找规律。

Celes1

直接做。

#include <bits/stdc++.h>
#define int long long
using namespace std;

int t, n;

int sqrtll(int n) {
  int l = 1, r = 1000000, ans = 0;
  for(; l <= r; ) {
    int mid = (l + r) >> 1;
    if(mid * mid >= n) {
      ans = mid, r = mid - 1;
    }else {
      l = mid + 1;
    }
  }
  return ans;
}

signed main() {
  freopen("spiral.in", "r", stdin);
  freopen("spiral.out", "w", stdout);
  for(cin >> t; t--; ) {
    cin >> n;
    int i = sqrtll(n);
    int tmp = n - (i - 1) * (i - 1);
    if((i & 1)) {
      if(tmp <= i) {
        cout << i << ' ' << tmp << '\n';
      }else {
        cout << 2 * i - tmp << ' ' << i << '\n';
      }
    }else {
      if(tmp <= i) {
        cout << tmp << ' ' << i << '\n';
      }else {
        cout << i << ' ' << 2 * i - tmp << '\n';
      }
    }
  }
  return 0;
}

B write

C curve

\[\because \frac{x}{3} \le \lfloor \frac{x}{2} \rfloor \le \frac{x}{2} \]

\[\therefore \frac{x}{3^{r - l + 1}} + \sum \limits_{i = l}^r \frac{a_i}{3^{r - i + 1}} \le \lfloor \frac{x}{2^{r - l + 1}} + \sum \limits_{i = l}^r \frac{a_i}{2^{r - i + 1}} \rfloor \le \frac{x}{2^{r - l + 1}} + \sum \limits_{i = l}^r \frac{a_i}{2^{r - i + 1}} \]

\[\because a_i, x \le 10^9 \]

\[\therefore \text{当 } r - i + 1 \ge 30 \ge \log_2 10^9, \frac{x}{3^{r - i + 1}} \to 0, \frac{x}{2^{r - i + 1}} \to 0, \]

\[\therefore \lfloor \frac{x}{2^{r - i + 1}} \rfloor \to 0 \]

直接暴力。

#include <bits/stdc++.h>
using namespace std;

int n, arr[200020], q, x, l, r;

int main() {
  freopen("curve.in", "r", stdin);
  freopen("curve.out", "w", stdout);
  cin >> n;
  for(int i = 1; i <= n; i++) {
    cin >> arr[i];
  }
  for(cin >> q; q--; ) {
    cin >> x >> l >> r;
    l = max(l, r - 50);
    for(int i = l; i <= r; i++) {
      x = (x + arr[i]) / 2;
    }
    cout << x << '\n';
  }
  return 0;
}

D coin

乱搞

我们充分发挥人类智慧,根据数学直觉,不能凑出的数必然在 \(2.69 \times 10^7\) 以上。

直接对于 \(2.69 \times 10^7\) 下面的数暴力 dp,上面的都凑的出来。

/**
 * @brief "According" to my direst sence,
 * @brief the maximum number which "will output -1" is not greater than 2.69*(10^7).
*/
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int kCstf = 2.69e7;

int n, l, arr[22], dp[kCstf + 20];

signed main() {
  freopen("coin.in", "r", stdin);
  freopen("coin.out", "w", stdout);
  cin >> n >> l;
  for(int i = 1; i <= n; i++) {
    cin >> arr[i];
  }
  if(l <= kCstf) {
    dp[0] = 1;
    for(int i = 1; i <= n; i++) {
      for(int j = arr[i]; j <= l; j++) {
        dp[j] |= dp[j - arr[i]];
      }
    }
    int ans = 0;
    for(int i = 1; i <= l; i++) {
      ans += dp[i];
    }
    cout << ans << '\n';
  }else {
    dp[0] = 1;
    for(int i = 1; i <= n; i++) {
      for(int j = arr[i]; j <= kCstf; j++) {
        dp[j] |= dp[j - arr[i]];
      }
    }
    int ans = 0;
    for(int i = 1; i <= kCstf; i++) {
      ans += dp[i];
    }
    cout << ans + (l - kCstf) << '\n';
  }
  return 0;
}
正解

同余最短路,模数是最大值。

posted @ 2024-09-25 15:52  hhc0001  阅读(14)  评论(0)    收藏  举报