总结
估分 \([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 - 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\),那么:
且
然后定义新运算 \(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;
}