20250810 模拟赛 总结
T1
打表发现答案是欧拉函数(bushi)
i64 get_phi(i64 x) {
if (x <= i64(N)) {
return phi[x];
}
i64 ans = x;
for (int p : primes) {
if (1ll * p * p > x) break;
if (x % p == 0) {
while (x % p == 0) {
x /= p;
}
ans = ans / p * (p - 1);
}
}
if (x != 1) {
ans = ans / x * (x - 1);
}
return ans;
}
int main() {
for (int i = 2; i <= N; ++i) {
if (!not_prime[i]) {
primes.push_back(i);
phi[i] = i - 1;
}
for (int pri_j : primes) {
int k = i * pri_j;
if (k > N) break;
not_prime[k] = true;
if (i % pri_j == 0) {
phi[k] = phi[i] * pri_j;
break;
} else {
phi[k] = phi[i] * (pri_j - 1);
}
}
}
int T;
fin >> T;
while (T--) {
i64 a, m;
fin >> a >> m;
i64 d = std::__gcd(a, m);
fout << get_phi(m / d) << '\n';
}
return 0;
}
T2
发现非法的仅有ABBBBB 或者BAAAAA AAAAAB BBBBBA A B,减去即可
T3
发现第三个暴力转移是 n^2的,考虑优化,二分+哈希求出来lcp,然后数据结构优化转移即可。
T4
只记录一个变量的答案和左面和右面三个字符,即可维护合并。