topcoder srm 575 div1

problem1 link

如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$

通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其他情况都是1

这个可以用数学归纳法证明

problem2 link

假设字符串的总长度为$n$

首先,设$x_{k}$为位置$i$经过$k$ 次交换后仍然在$i$的概率,那么在其他位置$j(j\ne i)$的概率为$\frac{x}{n-1}$.可以得到关于$x_{k}$的转移方程$x_{0}=1, x_{k}=x_{k-1}*\frac{C_{n-1}^{2}}{C_{n}^{2}}+(1-x_{k-1})*\frac{1}{C_{n}^{2}}$

计算出了$x_{k}$之后。对于$[1,n]$的某个位置$i$,其对答案的贡献为$G(i)=(x_{k}*P+\frac{x_{k}}{n-1}*(T-P))*S_{i}$

其中$S_{i}$表示位置$i$的数字。$P$表示任意选一个区间包含$i$的概率,$P=F_{i}=\frac{2i(n-i+1)}{n(n+1)}$,而$T=\sum_{i=1}^{n}F_{i}$

problem3 link

扫描二维码关注公众号,回复: 4607791 查看本文章

code for problem1

#include <string>

class TheNumberGameDivOne {
 public:
  std::string find(long long n) {
    if (IsFirstWin(n)) {
      return "John";
    }
    return "Brus";
  }

 private:
  bool IsFirstWin(long long n) {
    if (n == 1 || n % 2 == 1) {
      return false;
    }
    int c = 0;
    while (n % 2 == 0) {
      ++c;
      n /= 2;
    }
    if (n == 1 && c % 2 == 1) {
      return false;
    }
    return true;
  }
};

code for problem2

#include <string>
#include <vector>

class TheSwapsDivOne {
 public:
  double find(const std::vector<std::string> &seq, int k) {
    int n = 0;
    int sum = 0;
    for (const auto &e : seq) {
      n += static_cast<int>(e.size());
      for (char c : e) {
        sum += c - '0';
      }
    }
    auto Get = [&](int t) { return 2.0 * t * (n - t + 1) / n / (n + 1); };
    double sum_rate = 0.0;
    for (int i = 1; i <= n; ++i) {
      sum_rate += Get(i);
    }
    double p = 1.0 * (n - 2) / n;
    double q = 2.0 / n / (n - 1);
    double x = 1.0;
    for (int i = 1; i <= k; ++i) {
      x = p * x + q * (1 - x);
    }
    double result = 0;
    int idx = 0;
    for (const auto &e : seq) {
      for (size_t i = 0; i < e.size(); ++i) {
        ++idx;
        int d = e[i] - '0';
        double r = Get(idx);
        result += (x * r + (1 - x) / (n - 1) * (sum_rate - r)) * d;
      }
    }
    return result;
  }
};

code for problem3

猜你喜欢

转载自www.cnblogs.com/jianglangcaijin/p/10161916.html