牛客周赛 Round 79
A. 小红的合数寻找
题意:在
如果
点击查看代码
void solve() {
int x;
std::cin >> x;
if (x == 1) {
std::cout << -1 << "\n";
return;
}
if (x == 2) {
std::cout << 4 << "\n";
return;
}
x += x & 1;
std::cout << x << "\n";
}
B. 小红的小球染色
题意:有
要让操作数最小, 那么我们每三个球里选右边两个染色即可保证让最多的球不被染色, 进而操作数最少, 答案为
最多操作就是相邻两个两个选, 可以选
点击查看代码
void solve() {
int n;
std::cin >> n;
std::cout << (n / 3 + (n % 3 == 2)) << " " << n / 2 << "\n";
}
C. 小红的二叉树
题意: 求一棵满二叉树里有多少长度为2的简单路径.
高度为1个数为0, 高度为2则是1. 高度为3每个点都可以向上两次贡献一条路径, 以及每两个点可以通过父亲贡献一条路径。模拟累加即可。
点击查看代码
void solve() {
int n;
std::cin >> n;
if (n == 1) {
std::cout << 0 << "\n";
return;
}
if (n == 2) {
std::cout << 1 << "\n";
return;
}
Z ans = 1;
Z num = 4;
for (int i = 3; i <= n; ++ i) {
ans += num + num / 2;
num *= 2;
}
std::cout << ans << "\n";
}
D. 小红的“质数”寻找
题意:在
这题正解是分类讨论,最高位为1则输出"2"+
点击查看代码
const int N = 2e7 + 6;
std::vector<int> primes;
bool st[N];
void init(int n) {
st[1] = 1;
for (int i = 2; i <= n; ++ i) {
if (!st[i]){
primes.push_back(i);
}
for (auto & p : primes) {
if (p * i > n) {
break;
}
st[p * i] = true;
if (i % p == 0) {
break;
}
}
}
}
void solve() {
std::string s;
std::cin >> s;
std::reverse(s.begin(), s.end());
auto check = [&]() -> bool {
int sum = 0;
for (auto & c : s) {
sum += c - '0';
}
return !st[sum];
};
int t = 1;
for (auto & c : s) {
t += c - '0';
}
while (t -- ) {
if (check()) {
std::reverse(s.begin(), s.end());
std::cout << s << "\n";
return;
}
for (int i = 0; ; ++ i) {
if (i >= s.size()) {
s.push_back('1');
break;
}
if (s[i] == '9') {
s[i] = '0';
} else {
s[i] += 1;
break;
}
}
}
std::cout << -1 << "\n";
}
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
init(2e6);
int T = 1; std::cin >> T;
while (T -- ) {
solve();
}
return 0;
}
E. 小红的好排列
题意:求所以长度为
对于
设
答案为
点击查看代码
void solve() {
int n;
std::cin >> n;
if (n / 3 + n / 3 < n / 2) {
std::cout << 0 << "\n";
return;
}
std::vector<Z> fact(n + 1);
fact[0] = 1;
for (int i = 1; i <= n; ++ i) {
fact[i] = fact[i - 1] * i;
}
auto C = [&](int n, int m) -> Z {
if (n < m) {
return 0;
}
return fact[n] / fact[m] / fact[n - m];
};
int a = n / 2 - n / 3, b = n / 3 - (n / 2 - n / 3);
Z ans = C(n / 3, a) * C(n - n / 3, a) * fact[a] * C(n / 3, b) * fact[b] * fact[n - n / 3];
std::cout << ans << "\n";
}
F. 小红的小球染色期望
题意:有
设
考虑如何求
点击查看代码
void solve() {
int n;
std::cin >> n;
if (n == 1) {
std::cout << 0 << "\n";
return;
}
std::vector<Z> f(n + 1), sum(n + 1);
f[2] = sum[2] = 1;
for (int i = 3; i <= n; ++ i) {
f[i] = (Z)1 / (Z)(i - 1) * 2 * sum[i - 2] + 1;
sum[i] = sum[i - 1] + f[i];
}
std::cout << f[n] << "\n";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具