CSP-S 24

news/2025/10/20 21:45:24/文章来源:https://www.cnblogs.com/HS-fu3/p/19153746

9.21

今天开始集训告一段落了,去补文化课一周。

如果写不完回来会补(?)

115=100+0+15

t1

先等会

t2

先等会

t3

9.22:回来补债了

\([\gcd(i,j)=1]=[\gcd(p_i,p_j)=1]\)

这个限制初看好像很难转化,只能猜到与组合数和素数有关。

于是我们从原始情况入手,考虑如何变换之后得到的排列是符合条件的。

发现对于 2,4,8,16 \(\cdots\) 这些数任意交换位置后得到排列都是合法的,考虑从此入手。

进一步手模数据,发现关系一:

对于所有质因数集合相同的数,任意交换位置后排列合法

解释:我们只关心两个数及其下标是否互质,因此我们只关心其质因数集合是否相同。(多模会数据就理解了)

可是这还不够,继续寻找。

关系二:

\(1\le i \le n\) 中,对于所有满足 $\lfloor \frac{n}{pri_i} \rfloor\le 1 $ 的素数可以与 \(1\) 交换位置

解释:\(1\) 永远与所有数互质,而对于 $\lfloor \frac{n}{pri_i} \rfloor\le 1 $ 的素数在 \(1\le i \le n\) 范围内也与所有数互质,与 \(1\) 等效,故交换后合法。

此时已经可以过掉 \(n=13\) 了,但当 \(n=14\) 时答案依旧错误。

发现错误原因:5,10 与 7,14 可以整体交换!

我们发现它们的质因数的出现次数相同 ,即说明对于一个质因数的约束,我们只关心其约束条件是否成立而并不关心质因数的值,因此对于质因数出现次数相同也可整体交换

此为关系三。

到此结论已推完,实现即可。

交换对应排列,乘对应阶乘即可。

只需找出所有质因数集合并统计个数 \(\cdots\)

等等,这一步咋实现 ?

map 里放 vector

这个我也是赛后才知道可以这么套,学到了。

具体实现看代码。

code

点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10;
const int p = 13131;
const int mod = 1e9 + 7;
int n, ans;
int f[N], cnt[N];
int pri[N], tot;
int t[N];
bool flag[N];
vector<int> e[N];
map<vector<int>, int> mp;inline void init()
{f[0] = 1, f[1] = 1;flag[1] = 1;for (int i = 2; i <= n; ++i){f[i] = f[i - 1] * i % mod;if (!flag[i])pri[++tot] = i;for (int j = 1; j <= tot; ++j){if (i * pri[j] > n)break;flag[i * pri[j]] = 1;if (i % pri[j] == 0)break;}}
}signed main()
{freopen("tg.in", "r", stdin);freopen("tg.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cin >> n;init();for (int j = 1; j <= tot; ++j)for (int i = pri[j]; i <= n; i += pri[j]){e[i].push_back(j);++cnt[j];}for (int i = 1; i <= n; ++i){if (!flag[i]){if (e[i].size() == 1 && cnt[e[i][0]] == 1)e[i][0] = tot + 1;//将关系二中满足条件的素数与1放入一个集合}if (i == 1)e[i].push_back(tot + 1);++mp[e[i]];}ans = 1;for (int i = 1; i <= tot; ++i)++t[cnt[i]];for (int i = 2; i <= n; ++i) // 5 10 7 14 可互换:质因数出现次数相同时可互换,桶记录ans = ans * f[t[i]] % mod;for (auto y : mp) // 记录质因数种类相同的数的个数ans = ans * f[y.second] % mod;cout << ans << "\n";return 0;
}

t4

9.23:补ing

看完题第一感觉就是最小生成树,但发现将所有边连出再生成显然要爆炸,而只对每个城市内的图做最小生成树又不好处理高铁的情况。

这时我们要开始利用最小生成树的思想。

肯定要用到最小生成树,再做一部分后续处理。

对于每个城市内的图是同构的,显然可以做一遍最小生成树,先筛选出可能被选的边,再进行后续处理。

我们把枢纽站叫作关键点。

若无高铁站的情况,则显然为每个城市内最小生成树。

考虑有高铁站后的影响:

对于城市内的点,不一定可以在城市内直接到达,也就是说,若建造高铁站更优,则可以通过高铁站到达其它城市,再到达目标点,即在同一城市内,图不一定连通

考虑如何选择这些边:

观察易得,所有不在关键点之间路径上的树边都一定会被选,为了保证整张图连通,这些边必选,直接累加答案即可。

对于其它边,将其记录下来( \(e\) 数组)当作备选。

高铁站更优当且仅当 \(a_i\le b_i+d_j\) ,即 \(a_i-b_i\le d_j\)

也就是说,对于一个城市,所有边权(被选出的边)大于 \(a_i-b_i\) 的边,都应不修建。

这启发我们对于城市按 \(a_i\) 升序排列(后有解释),对于 \(e\) 数组按照边权升序进行排序,求前缀和,随后对于每个城市,二分找出哪一条边以后都应不修建,利用前缀和求出应修建的边的贡献,不修建的边数乘 \(a_i\) 作为修高铁的贡献。

对于 \(1\) 号城市与 \(l\) 号城市直接连权值最小的前 \(r-1\) 条边保证在最后一个城市内部连通,否则若没有城市内部连通,则高铁再多图也不连通。(这时体现将城市排序的作用,修建高铁时选择费用少的,对于费用最大的城市令其内部连通,以此在保证图连通时总费用最小)。

关于如何选出关键点之间的路径:

我们将关键点的 \(fa\) 都设为 \(0\) ,表示它们已被连通,之后正常最小生成树,若 \(find(u)\not=find(v)\) ,则不为关键点路径上的边,直接累加答案即可,否则表示为关键点路径上的点(因为所有关键点已事先“被连通”,发现两点的 \(fa\) 相同则一定为关键点加入树中路径上的点,不理解就造样例手模),将其加入 \(e\) 数组即可。

code

点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, m, l, r, sumb, ans;
int fa[N], id[N];
int a[N], b[N], sumq[N];
int s[N], q[N], tot;
struct node
{int u, v;int val;
} e[N];
inline int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
inline bool cmp(node a, node b) { return a.val < b.val; }
inline bool cmp2(int x, int y) { return a[x] < a[y]; }signed main()
{freopen("rb.in", "r", stdin);freopen("rb.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;for (int i = 1; i <= m; ++i){cin >> e[i].u >> e[i].v >> e[i].val;++e[i].u, ++e[i].v;}sort(e + 1, e + 1 + m, cmp);for (int i = 1; i <= n; ++i)fa[i] = i;for (int i = 1; i <= m; ++i) // 先最小生成树降低边数至n{int fu = find(e[i].u), fv = find(e[i].v);if (fu != fv)e[++tot] = e[i], fa[fu] = fv;}for (int i = 1; i <= n; ++i)fa[i] = i;cin >> l;for (int i = 1; i <= l; ++i)cin >> a[i] >> b[i], sumb += b[i];cin >> r;for (int i = 1; i <= r; ++i)cin >> s[i], ++s[i], fa[s[i]] = 0;tot = 0;for (int i = 1; i < n; ++i){int u = find(e[i].u), v = find(e[i].v);if (u != v)fa[u] = v, ans += sumb + e[i].val * l;elseq[++tot] = e[i].val;}for (int i = 1; i < r; ++i)sumq[i] = sumq[i - 1] + q[i];for (int i = 1; i <= l; ++i) // 城市之间fa[i] = id[i] = i;sort(id + 1, id + 1 + l, cmp2);for (int i = 1; i < l; ++i) // 连高铁{int x = id[i];int y = x % l + 1;x = find(x), y = find(y);if (b[x] < b[y])swap(x, y);int pos = upper_bound(q + 1, q + r, a[id[i]] - b[x]) - q - 1; // a b+d --> a-b d 二分找位置ans += b[x] * pos + sumq[pos] + (r - pos) * a[id[i]];fa[x] = y;}ans += b[find(1)] * (r - 1) + sumq[r - 1]; // a最大的直接连权值最小r-1条边保证连通cout << ans << "\n";return 0;
}

咕...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/941640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正睿 2025 NOIP20 连测 Day5 做题记录

T1给 \(m\) 个质数,第 \(i\) 个质数 \(p_i\) 出现了 \(n_i\) 次。求一种划分质数的方案,使得第一个集合的和等于第二个集合的乘积。萌萌题,注意到最后相当于是要求 \(p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_k^{\alp…

29-腾讯云COS接入指南与价格说明

腾讯云对象存储(COS)接入流程与价格说明 一、腾讯云COS简介 腾讯云对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性、低成本、高可靠性和高安全性等特点。用户可…

LLM学习记录DAY7

📘今日LLM学习笔记总结 一、大模型解码策略 1.1 自回归解码定义:逐词生成下一个词,基于已生成内容继续生成。 流程:输入词序列 ( u ) 重复:模型输出下一个词的概率分布 ( P ) 采样或选择下一个词 ( u ) 将 ( u )…

CSP-S 23

9.179.17 109=9+100 赛时将剩余时间“明智”的投入t4,结果就是后两题没分。 t1 三维前缀和+二分答案 写了个假的kdt调了2h... 二分显然是好想的。 看值域考虑复杂度: \(256\times 256\times 256\times 8=134217728\) …

Recall

可惜了,这静谧的长夜。 是夕阳,余晖照在我的肩上。 惨白的灯喧哗着。 昏黑,安静的可怕。 滴答,滴答。 滴答,滴答。 昏黑,安静的可怕。 惨白的灯喧哗着。 是夕阳,余晖照在我的肩上。 可惜了,这静谧的长夜。

CSP-S 20

9.119.11 今天是挂分的好日子~~~ 101=0+10+91 t1 追逐游戏 (chase) 倍增+k祖先 算了不想写了....... 第2次没保存然后死机丢失了... 不难理解也不难实现,细节手模即可。 t1 就这样吧,看代码。 code点击查看代码 #…

Flutter应用设置插件 - 轻松打开iOS和Android系统设置

一个功能强大的Flutter插件,支持从应用中直接打开iOS和Android系统的各种设置页面,包括位置、Wi-Fi、通知、蓝牙等系统设置,简化了用户设置跳转流程。app_settings 一个用于从Flutter应用中打开iOS和Android手机设置…

CSP-S 22

9.169.16 原来史可以连着吃 挂了100 t1 简单贪心,不多解释。 没有大样例爆了 code点击查看代码 #include <bits/stdc++.h> #define int long long using namespace std; const int inf = 1e18; int minn; int T…

/usr/bin/sudo 二进制文件的权限有问题,导致所有用户都无法使用 sudo

[root@node1 sudoers.d]# su - student [student@node1 ~]$ sudo whoami sudo ls /root -bash: /usr/bin/sudo: Permission denied -bash: /usr/bin/sudo: Permission denied 问题很明确了!在 node1 上,/usr/bin/sud…

MySQL 8.0.43社区版本安装流程

MySQL 8.0.43社区版本安装流程> 1. MySQL的下载 点击MySQL官网地址进入https://www.mysql.com/cn/,选择页面download,选择社区版本下载。选择对应自己主机机型下载Windows或者Linux版本的,这里以Windows版本为例子…

CSP-S 19

9.109.10 125=10+20+75+20 废话 模拟赛能不能类人一点??? 因为四道题所以四个样例是吧,你给那小样例有任何作用吗我请问呢? t1 染色(color) 结论题 赛时想假了(你但凡有个稍微大点的样例我也不会想这么假) 显然…

LangGraph 记忆系统实战:反馈循环 + 动态 Prompt 让 AI 持续学习

代理系统或者 RAG 方案,基本都需要一个双层记忆架构,这样 LLM 既能保持对当前上下文的专注,又能记住过往交互的内容。 短期记忆负责单个会话内的即时信息管理,长期记忆则跨会话存储知识,让系统能够持续学习和进化…

【HOWTO】购买和销售二手测试仪器指南

测试仪器是电子工程师、技术人员和电子爱好者在进行信号分析、测量和诊断时不可或缺的工具。尽管全新的测试仪器通常能提供最先进的技术,但价格往往较高,特别是对于预算有限的人。因此,二手测试仪器市场成为了一种经…

CSP-S 18

9.89.8 100+0+20+0 废话 赛时t1先打的暴搜,大数据直接飞了,折半搜即过,30min(当时感觉写的挺快应该不会很差)。 t2先模样例,哎怎么不对?哦少考虑情况。哎怎么还是不对?啊乘写成加了... 各种唐诗错误开始发力了,…

研1转码自学黑马程序员Python第7天 | Python函数知识 - 指南

研1转码自学黑马程序员Python第7天 | Python函数知识 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

小马算力致敬程序员

10 月 20日凌晨,我把最后一条 CI 流水线从自建 GPU 机器迁移到小马算力,推送、合并、触发——单元测试跑完,账单弹出:0.82。 同一时刻,公司群里弹出财务提醒:上月闲置显卡折旧 4 300。那一刻,我意识到“算力”这…

Project. 2025.11化学小组pre

\(\boldsymbol{Project.}\) 2025.11 化学小组pre \(\rm I\) 选题阶段 \(\it 1.1\) 超导 【文献堆】介绍超导(泛) 常压下双层结构镍氧化物薄膜高温超导电性的发现与研究展望 高压下金属硼碳(氮)化合物的结构及超导电…

蛋白表达标签:重组蛋白研究的精妙引擎

在重组蛋白的世界里,效率与精准是核心追求。如何从复杂的细胞裂解液中快速捕获目标蛋白?如何直观地追踪其表达与定位?又如何让那些难以折叠的蛋白稳定溶解?这些问题的答案,常常不在于蛋白本身,而在于一个精妙的分…

106.腾讯地图位置服务再出错

106.腾讯地图位置服务再出错我再实现项目的一个客户端登录时候 出现问题为了实现此功能之前关于地图调用的总结https://www.cnblogs.com/gaodiyuanjin/p/19135390 以为换了就好了 但项目已经使用这个 顺便插一下 项目中…