Luogu P10034 「Cfz Round 3」Circle 题解 [ 蓝 ] [ 背包 DP ] [ 质数筛 ] [ 图论 ] [ 构造 ]

news/2025/10/20 21:27:08/文章来源:https://www.cnblogs.com/zhr0102/p/19153697

Circle:思维难度并没有很大,难点主要还是细节的特判上。

先转化题意:构造一张无自环的有向图,使得每个点的出度、入度均为 \(1\),并且部分点走 \(l\) 步后必须回到自己。

因为每个点的出度、入度均为 \(1\),所以这张图一定由若干个有向环组成

然后发现,在不能走自环的情况下 \(u\)\(l\) 步回到 \(u\) 的条件相当于 \(u\) 所处的环的长度 \(\bm{len}\) 必须是 \(\bm l\) 的一个约数,否则一定无法返回自己。

同时可以发现,如果一个环的长度不是质数,那么这个环一定可以接着拆分。因为拆出来的环长一定都是原环的约数。由此可知选长度为质数的环一定不劣

于是问题被转化为了,能否从 \(l\)质因子中选择若干个数作为环长,使得环长总和大于等于 \(1\) 的个数,且小于等于 \(n\)。我们只需要把全部的 \(1\) 都放入这个环中,把剩下的 \(0\) 随便编一个环即可。

这显然是一个背包问题,因为 \(\bm l\) 的质因子最多只有 \(\bm{\log l}\),所以时间复杂度 \(O(n\log l)\),注意要记录转移的前驱。最后遍历可能的环长总和,进行构造即可。

注意一些边界条件:

  • \(S\) 全部为 \(0\) 时,随便构造一个排列即可。
  • \(l = 0\),随便构造一个排列即可。
  • 环长总和为 \(n - 1\) 的时候,剩下的一个节点因为无法连自环,所以不是个合法的方案。
#include <bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi = pair<int, int>;
const int N = 500005;
ll n, m, a[N], dp[N], pre[N], c[N], ans[N];
bitset<N> vis;
int prm[N], cnt, b[N], bcnt, ccnt;
void init()
{vis[1] = vis[0] = 1;for(int i = 2; i < N; i++){if(vis[i] == 0)prm[++cnt] = i;for(int j = 1; j <= cnt && i * prm[j] < N; j++){vis[i * prm[j]] = 1;if(i % prm[j] == 0) break;}}
}
void solve()
{cin >> n >> m;int num1 = 0;bcnt = 0;for(int i = 1; i <= n && i <= m; i++)if(vis[i] == 0 && m % i == 0)b[++bcnt] = i;for(int i = 1; i <= n; i++){char c;cin >> c;a[i] = c - '0';num1 += a[i];}if(num1 == 0 || m == 0){for(int i = 1; i < n; i++) cout << i + 1 << " ";cout << 1 << "\n";return;}memset(dp, 0, sizeof(dp));dp[0] = 1;for(int i = 0; i <= n; i++){if(dp[i] == 0) continue;for(int j = 1; j <= bcnt; j++){int v = i + b[j];if(v > n) continue;if(dp[v] == 0){dp[v] = 1;pre[v] = b[j];}}}vector<int> res;for(int i = num1; i <= n; i++){if(i == n - 1) continue;if(dp[i]){int now = i;while(now){res.push_back(pre[now]);now -= pre[now];}break;}}if(res.size() == 0){cout << "-1\n";return;}ccnt = 0;for(int i = 1; i <= n; i++)if(a[i] == 1)c[++ccnt] = i;for(int i = 1; i <= n; i++)if(a[i] == 0)c[++ccnt] = i;int cur = 0;for(auto itm : res){for(int i = 1; i < itm; i++){++cur;ans[c[cur]] = c[cur + 1];}++cur;ans[c[cur]] = c[cur - itm + 1];}if(cur != n){for(int i = cur + 1; i < n; i++)ans[c[i]] = c[i + 1];ans[c[n]] = c[cur + 1];}for(int i = 1; i <= n; i++) cout << ans[i] << " ";cout << "\n";
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);init();int t;cin >> t;while(t--) solve();return 0;
}

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

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

相关文章

2025.10.20模拟赛

赛时 T1是原...10分钟过了 然后先看了眼3个题,T2感觉可推,T3感觉更简单 想开T3,然后想到还是按顺序开吧,所以开的T2 先推了一会重复的性质,发现什么也没有 此时1h过去了 然后想到前缀和的性质,然后没怎么证明,然…

20232410 2025-2026-1 《网络与系统攻防技术》实验二实验报告

20232410 2025-2026-1 《网络与系统攻防技术》实验二实验报告 一、实验内容回答问题: (1)例举你能想到的一个后门进入到你系统中的可能方式? 比如某些钓鱼邮件或者钓鱼网站,携带着一些捆绑着后门程序的exe文件。若…

SQLite简单使用

SQLite的简单使用记录创建数据库创建完成简单使用先进行一个链接一个表 一个视图创建表 输入表明创建列后面的就跟MySQL大差不差了创建完之后点击OK点击这个可以查看SQL语句

Adaptive Learning Rate(自适应学习率) - -一叶知秋

Adaptive Learning Rate(自适应学习率) Adaptive Learning Rate(自适应学习率) 是指在模型训练过程中,学习率会根据参数更新的反馈自动调整,而不是使用一个固定值。其核心思想是: 👉 不同参数或不同训练阶段,…

新学期每日总结(第12天)

今日 相较昨日 学习了继承与多态

17 线程的创建

17 线程的创建进程 进程:一个程序的运行过程 线程:组成这个程序的并行的模块 一个进程可以包含多个线程。 线程的创建继承Thread类 实现Runnable接口 实现Callable接口1.继承Thread类 继承Thread类,重写run()方法,…

2025.10.20总结 - A

今天满课,感觉挺充实的,加油。

一般公共预算收入 + 全国政府性基金收入

一、税收增速意外创出新高 9月,一般公共预算收入(+2.6%),温和回升0.6个百分点,其中税收(+8.7%)显著回升5.3个百分点,增速创2023年7月以来新高;非税(-11.4%)受去年同期大幅征收、基数走高的影响跌幅扩大。支…

从C10K到Reactor:事件驱动,如何重塑高并发服务器的网络架构

从C10K到Reactor:事件驱动,如何重塑高并发服务器的网络架构事件驱动 事件驱动(Event Driven)是一种核心的编程范式,其根本特征是控制反转(Inversion of Control,IoC)。在这种模型中,程序的执行流不再由代码的…

类欧几里德算法

引入 Floor Sum 令 \(f(a,b,c,n)=\displaystyle \sum_{i=0}^{n}\lfloor\dfrac{a\times i+b}{c}\rfloor\)。我们要求的就是这个东西。 考虑如果 \(a,b\) 中有一个比 \(c\) 大。那么有: \[f(a,b,c,n)=\sum_{i=0}^{n}\lf…

AI助力可再生能源系统优化研究

本文介绍了研究者如何利用人工智能技术解决能源供应挑战,重点探讨了大语言模型在数值数据分析、风能评估和齿轮箱功率损失预测中的应用,以及将AI扩展到太阳能和水电等可再生能源领域的未来计划。使用AI应对能源供应挑…

结对项目:小学四则运算题目生成器

结对项目:小学四则运算题目生成器这个项目属于哪个课程 课程链接作业要求 作业链接作业的目标 结对编程实现一个自动生成小学四则运算题目的命令行程序学号姓名 3223004816王韵清,3223004820曾钰仪Github链接 Github…

数据范围

废话不多讲,直接给图:(注意:不同版本的c++程序,数据范围可能有所改动!!!)

CF2107E Ain and Apple Tree

拆贡献拆到每个点就是 \(C_{siz}^2\)。 根据世界沉睡童话的结论,我们很大概率能用这种不同的 \(siz\) 组合出很多数,打个表发现都能组合出来,然后依次挂在一条链上就做完了(因为叶子没有贡献)。

2025,为什么公众号编辑器排版决定阅读完成率?——一次从流程到结果的深评

在2025,公众号编辑器选型里,我更关心的不是“功能堆满没”,而是“能否把创作从起笔到发布,做成省心、稳定、可复制的流程”。 这篇测评以“知识类自媒体”常见稿型为样本,完整跑通“选题→结构→AI排版→多平台分…

P14262 [ROI 2015 Day1] 自动好友

P14262 [ROI 2015 Day1] 自动好友 题解题目传送门 我的博客-欢迎光顾 写了一个很另类的容斥。。。比其他dalao的做法复杂不少(为了方便描述,如果 \(i,j\) 是一对潜在好友,我们就称 \((i,j)\) 是一对朋友对) (以下…

傻瓜式处理kauditd0病毒程序记录

服务器莫名奇妙很慢,top指令查看,有个kauditd0进程导致cpu占用很高,自己或者网上尝试了各种方式,都要死灰复燃,最终打算删除启动程序的账号es,这个账号并非我正在使用发账号,直接deluser删除也会有进程占用不让…

win10 升级 win11 后时间更新失败

可能的原因:时间服务器设置问题 设置路径:设置 \(\to\) 时间和语言 \(\to\) 日期和时间 \(\to\) 更改时间服务器可选授时服务器:cn.pool.ntp.org Windows Time 服务问题 若步骤 1 同步失败,可能是 Windows Time 服…

软件工程学习日志2025.10.20

今日概览统一了全站顶部导航的视觉样式,移除各页面导航按钮的 primary 高亮,确保颜色一致与信息层级清晰。 修正了个人中心页的导航,移除指向当前页的“个人中心”按钮,避免自指链接。 启动并验证了本地服务,通过…