10.11模拟赛总结

总结

估分 \([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\) 的满二叉树,节点上有颜色“黑色”(1)、“白色”(0),有如下操作:

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

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

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

  • 如果棋子走出了这棵树,那么拿走这颗棋子。

如果走过的黑色棋子数量为偶数,Alice 获胜,否则 Bob 获胜。

每次在第 \(i\) 个节点处放上一枚棋子,假设两个人都采用最优策略,问谁能赢。

分析

有点像博弈论,先去补了,鸽鸽鸽。

哦,爆搜,搜完之后判断一下,有没有赢得可能,只要有一个可能能赢就赢了,输得可能性只有所有的可能都是输。

代码

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

using namespace std;

const int kMaxN = 1 << 16;

struct T {
	set<int> s;
	bool operator<(const T &a) const {
		return s != a.s ? 1 : 0;
	}
};

int l[kMaxN], r[kMaxN], a[kMaxN], p[105][105], b[105], vis[105], n, tot, rt;
map<T, bool> mp[2][2];

int Dfs(int op, int cnt, set<int> v) {
	T x;
	x.s = v;
	if (mp[op][cnt].count(x)) {
		return mp[op][cnt][x];
	} else if (!v.size()) {
		return !cnt;
	} else {
		set<int> t[3];
		for (int i : v) {
			if (l[i]) {
				t[0].insert(l[i]);
			}
			if (r[i]) {
				t[1].insert(r[i]);
			}
			if (l[i] && r[i]) {
				t[2].insert(l[i]);
				t[2].insert(r[i]);
			}
			cnt += a[i];
		}
		cnt %= 2;
		int x = rand() % tot + 1;
		if (op == 0) {
			if (Dfs(1, cnt, t[p[x][1] - 1])) {
				return 1;
			} else if (Dfs(1, cnt, t[p[x][2] - 1])) {
				return 1;
			} else if (Dfs(1, cnt, t[p[x][3] - 1])) {
				return 1;
			}
			return 0;
		} else {
			if (!Dfs(0, cnt, t[p[x][1] - 1])) {
				return 0;
			} else if (!Dfs(0, cnt, t[p[x][2] - 1])) {
				return 0;
			} else if (!Dfs(0, cnt, t[p[x][3] - 1])) {
				return 0;
			}
			return 1;
		}
	}
}

void Sol(int stp) {
	if (stp > 3) {
		++tot;
		for (int i = 1; i <= 3; i++) {
			p[tot][i] = b[i];
		}
		return;
	}
	for (int i = 1; i <= 3; i++) {
		if (!vis[i]) {
			vis[i] = 1;
			b[stp] = i;
			Sol(stp + 1);
			vis[i] = 0;
		}
	}
}

int main() {
	srand(time(0));
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> l[i] >> r[i] >> a[i];
	}
	Sol(1);
	for (rt = 1; rt <= n; rt++) {
		set<int> v;
		v.insert(rt);
		cout << (Dfs(0, 0, v) ? "Alice" : "Bob") << '\n';
	}
	return 0;
}
}

\(\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----------} \]

posted @ 2023-10-11 16:58  Yun_Mengxi  阅读(27)  评论(0)    收藏  举报