10.11模拟赛总结

发布时间 2023-10-11 17:04:25作者: Yun_Mengxi

总结

估分 \([40, 70] + [70, 80] + [0, 45] + [20, 30] = [130, 225]\)

\(40 + 80 + 0 + 20 = 140\),Rk.14,寄寄寄/wq。

\(\texttt{T1 reflect}\)

题意

有一个几何图形有两条对称轴夹角为 \(\dfrac{p}{q}\),求最少还有几条对称轴。

分析

设最小的对称轴数量为 \(k\),那么不难推出式子:

\[k = \dfrac{q \times 180^\circ}{\gcd(q \times 180^\circ, p)} \]

但是由于题目中说了“还”这个字,所以答案为 \(k - 2\)

警示后人:不开 long long 见祖宗!!!

寄因

挂分:\(\texttt{60pts}\)

原因:没有推出式子/kk

代码

点击查看代码
#include <bits/stdc++.h>

using namespace std;

int main() {
  int t;
  cin >> t;
  while (t--) {
    long long p, q;
    cin >> p >> q;
    cout << q * 180ll / __gcd(q * 180ll, p) - 2ll << '\n';
  }
  return 0;
}

\(\texttt{T2 multi}\)

题意

\(a, b\) 都为 \(K\) 位无符号二进制非负整数,定义新运算 \(a +^\hat{}\ b\) 为,若 \(a, b\) 最高位都为 \(1\),那么最高位的进位将进在最后一位上。

举个例子:

\(K = 2\),那么:

\[(10)_2 +^\hat{}\ (10)_2 = (01)_2 \]

\[(10)_2 +^\hat{}\ (11)_2 = (10)_2 \]

然后定义新运算 \(a \times^\hat{}\ b = \begin{cases}0, b = 0\\a \times^\hat{}\ (b - 1), b \ne 0\end{cases}\)

给定 \(K\),请你求出 \(\forall 0 \le i < 2^k, 0 \le j < 2^k\)\(i \times^\hat{}\ j\) 的值。

分析

简单模拟题,只是需要亿点点卡常(

对于每个 \(i\),定义 \(sum = 0\),然后每次输出后模拟一下 \(\,+^\hat{}\,\) 的过程就行了。

代码

点击查看代码
#include <bits/stdc++.h>

using namespace std;

int k;

signed main() {
  cin >> k;
  for (int i = 0; i < 1 << k; i++) {
    int sum = 0;
    for (int j = 0; j < 1 << k; j++) {
      cout << sum << ' ';
      sum = sum + i + (bool)(sum + i & (1 << k)) & ((1 << k) - 1);
    }
    cout << '\n';
  }
  return 0;
}

(没想到不关同步流都能跑进 \(850\) 毫秒)

\(\texttt{T3 game}\)

题意

有一棵高度为 \(n\) 的满二叉树,节点上有颜色和棋子(不一定),有如下操作:

  • 将每个棋子移动到当前节点的左孩子;

  • 将每个棋子移动到当前节点的右孩子;

  • 将每个棋子分别复制到当前的左右孩子。

分析

咕咕咕

代码

点击查看代码
咕咕咕

\(\texttt{T4 sign}\)

题意

对于 \(n\) 的排列 \(a\)\(b\),定义 \(a \circ b\) 为,对于 \(\forall 1 \le i \le n, a_i = a_{b_i}\);定义 \(a^m\)\(\begin{cases}a, m = 1\\a \circ a_{m - 1}, m > 1\end{cases}\)

给定一个 \(n\) 的排列 \(a\) 和正整数 \(m\),求 \(a^m\)

分析

好典。

找一下环,然后高精模一下,没了。

代码

点击查看代码

这个就不一定是浅浅了(

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

typedef long long ll;

const int kMaxN = 1e6 + 5;

int n, tow[kMaxN], ms;
string m;
int ans[kMaxN];

int vis[kMaxN], siz[kMaxN], isz[kMaxN];
vector<int> sizs, mods;

void dfs(int u, int rt) {
  vis[u] = rt;
  siz[rt]++;
  if (tow[u] == rt) {
    if (!isz[siz[rt]]) {
      sizs.push_back(siz[rt]);
      isz[siz[rt]] = sizs.size() - 1;
    }
    return;
  }
  dfs(tow[u], rt);
}

int mod(int p) {
  ll res = 0ll;
  for (int i = 1; i <= ms; i++) {
    int cc = m[i] - '0';
    res = res * 10 + cc;
    if (res >= p) {
      res %= p;
    }
  }
  return res;
}

void solve(int u, int v) {
  ans[u] = v;
  if (!ans[tow[u]]) {
    solve(tow[u], tow[v]);
  }
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n;
  for (int i = 1; i <= n; i++) {
    int x;
    cin >> x;
    tow[i] = x;
  }
  cin >> m;
  ms = m.size();
  m = " " + m;
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) {
      dfs(i, i);
    }
  }
  for (int i = 0; i < sizs.size(); i++) {
    mods.push_back(mod(sizs[i]));
  }
  for (int i = 1; i <= n; i++) {
    if (vis[i] == i) {
      int y = i, jps = mods[isz[siz[i]]];
      for (int j = 1; j <= jps; j++) {
        y = tow[y];
      }
      solve(i, y);
    }
  }
  for (int i = 1; i <= n; i++) {
    cout << ans[i] << ' ';
  }
  return 0;
}

\[\color{springgreen}\text{----------EOF----------} \]