CF932C Permutation Cycle
题目传送门
思路:
个人认为构造题全靠感性理解,理解对了问题就迎刃而解了。(有点像做阅读理解)
我们先感性地理解题目中所有变量和函数的含义。
函数是什么?
当
这就可以联想到在一张图上移动,那么
那么当
注意到每次移动为
将整个问题放在一张有向图上,所以
数组是什么?
根据我们对
综上所述,问题变成了:构造一个含有
手玩一下样例一,发现它构造的有向图如下:
发现是一个长度为
从中我们可以得到启发:在图中构造两种环,一种长度为
设构造了
所以解不定方程:
即可。
其中
由于输出一种方案即可,数据范围也不大,可以暴力枚举
最后构造就行了。
#include <iostream>
using namespace std;
const int N = 1000010;
int n, a, b;
int p[N];
int main() {
scanf("%d%d%d", &n, &a, &b);
bool flag = false;
int x, y;
for(x = 0; x <= n / a; x++) //枚举 x
if((n - x * a) % b == 0) {
flag = true;
y = (n - x * a) / b;
break; //随便找一个解
}
if(!flag) puts("-1"); //找不到解
else {
int id = 1;
for(int i = 1; i <= x; i++) { //构造 x 个长度为 a 的环
for(int j = 1; j < a; j++)
p[id] = id + 1, id++;
p[id] = id - a + 1, id++;
}
for(int i = 1; i <= y; i++) { //构造 y 个长度为 b 的环
for(int j = 1; j < b; j++)
p[id] = id + 1, id++;
p[id] = id - b + 1, id++;
}
for(int i = 1; i <= n; i++) printf("%d ", p[i]);
}
return 0;
}
总结一下如何做构造题(仅供参考):
- 先理解清楚题中每个定义的含义;
- 根据定义大胆发挥联想;
- 从样例和样例解释找灵感。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】