[CF]Round511
这场比赛我及时的参加了,但是打的时候状态实在是太烂了,只做出来了Div2的AB题。
A Little C loves 3 I
直接构造就行。
B Cover Points
应该很容易就看出来这个等腰三角形的腰是坐标轴,然后就用y=b−x的一次函数往上套就行了。
C Enlarge GCD
这个题比赛的时候我交了4次,没有一次想到要先除gcd的。实际上在赛场上我已经接近正解了,就是枚举素因子,然后把最多的那个留着,其他的删掉就好了啊。
好吧,说起来简单,真正要把代码写到AC还是要看std的(摔
话说std的码都好短啊。
Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
const int N = 15000000+10;
const int M = 3e5 + 10;
int pri[N], notp[N], sz;
int n, d[N], a[M];
void get_pri() {
notp[1] = 1;
for (int i = 2; i < N; ++i) {
if (!notp[i]) notp[i] = pri[++sz] = i;
for (int j = 1; j <= sz; ++j) {
int k = i * pri[j];
if (k >= N) break;
notp[k] = pri[j];
if (i % pri[j] == 0) break; // 我这里竟然写错了
}
}
}
int gcd(int x, int y) { return !y?x:gcd(y, x%y); }
int main() {
scanf("%d", &n);
get_pri();
int Gcd = 0;
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
Gcd = gcd(a[i], Gcd);
}
int ans = 0;
for (int i = 1, x; i <= n; ++i) {
for (int j = a[i]/Gcd; j > 1; )
for (++d[x = notp[j]]; notp[j] == x;) j /= notp[j];
}
for (int i = 1; i < N; ++i) ans = std::max(ans, d[i]);
printf("%d\n", !ans ? -1 : n - ans);
return 0;
}
D Little C Loves 3 II
一道鬼畜的找规律的题,有点小凯的疑惑的感觉。这个题没啥意思。
E Region Separation
这个题是一道真正的好题。
首先我们确定这个国家能否被分成k个level-2的区域,这其实并不难,设总和为S,那么每一块的和应该是S/k,我们从叶子节点开始考虑,记一个节点i及其子树的和为Si,每次遇到一个Si=S/k的节点就把它和它的子树分出去,这样,我们容易发现,只有Si≡0(mod的节点有可能被分出去。因此,至少要有k个节点满足这个条件才有可能把这个国家分成k份。由于所有的数都是正的,所以也可以推出至多有k个节点满足这个条件。那么我们就只用考虑有多少个k满足这个条件了,化简那个条件可以得到k是\dfrac{S}{\gcd (S, S_i)}的整数倍(这个有点靠直觉),然后就能DP求k是否是一个合法的解。
然后就可以得出这样的结论:level-i可以被划分为k_i个部分当且仅当level-2可以被划分为k_i个部分且k_{i-1}\mid k_i(这里稍微有点绕,就是要注意每层的每个区域的权值和相等这个条件),然后就可以DP了,设F_i为最后一层有i个区域的方案数,通过枚举i的倍数来转移就好了。
Code:
#include <cstdio>
typedef long long LL;
const int N = 1e6 + 10;
const LL MOD = 1e9 + 7;
int n, fa[N];
LL s[N], f[N], F[N];
LL gcd(LL x, LL y) { return !y?x:gcd(y, x%y); }
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", &s[i]);
for (int i = 2; i <= n; ++i) {
scanf("%d", &fa[i]);
}
for (int i = n; i; --i) s[fa[i]] += s[i];
for (int i = n; i; --i) {
LL x = s[1] / gcd(s[1], s[i]);
if (x <= n)
++f[x];
}
for (int i = n; i; --i) {
for (int j = i; (j+=i) <= n; ) f[j] += f[i];
}
F[1] = 1;
LL ans = 0;
for (int i = 1; i <= n; ++i) {
if (f[i] == i) {
ans = (ans + F[i]) % MOD;
for (int j = i; (j+=i) <= n; ) F[j] = (F[j] + F[i]) % MOD;
}
}
printf("%lld\n", ans);
return 0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!