当前位置: 首页 > news >正文

E - Permute K times 2

E - Permute K times 2

思路

这题由于序列P是一个排列,所以将P表示成一个图的时候,这个图将由 m m m个环构成

对于每个环上的点来说,第一回合它会移动到距离它为 2 2 2的点上,距离它为 2 2 2的点同时也以相同的方式移动,那么第二回合,它就会移动到距离它为 4 4 4的点上,得出规律,一个点移动 k k k回合会移动到距离它为 2 k 2^k 2k的点上,由于是在一个环上移动,所以直接取模环的长度即可

代码

这里直接使用jiangly的代码了,很简洁优美

//来自jiangly
#include <bits/stdc++.h>using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;int power(int a, i64 b, int p) {int res = 1;for (; b; b /= 2, a = 1LL * a * a % p) {if (b & 1) {res = 1LL * res * a % p;}}return res;
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int N;i64 K;std::cin >> N >> K;std::vector<int> P(N);for (int i = 0; i < N; i++) {std::cin >> P[i];P[i]--;}std::vector<bool> vis(N);for (int i = 0; i < N; i++) {if (vis[i]) {continue;}int j = i;std::vector<int> a;while (!vis[j]) {vis[j] = true;a.push_back(j);j = P[j];}i64 d = power(2, K, a.size());for (int x = 0; x < a.size(); x++) {P[a[x]] = a[(x + d) % a.size()];}}for (int i = 0; i < N; i++) {std::cout << P[i] + 1 << " \n"[i == N - 1];}return 0;
}

http://www.mrgr.cn/news/59187.html

相关文章:

  • 15分钟学 Go 第 20 天:Go的错误处理
  • uniapp路由权限拦截守卫
  • 深入详解 Java - Spring MVC
  • day02|计算机网络重难点之HTTP请求报文和响应报文、HTTP的请求方式(方法字段)、GET请求和POST请求的区别
  • 语音提示器-WT3000A离在线TTS方案-打破语种限制/AI对话多功能支持
  • Ubuntu 18.04 上将 python、pip 命令更改为指向 Python3、pip3
  • OpenFeign返回参数统一处理
  • 网络通信与并发编程(六)线程、进程池与线程池
  • 安全见闻1-9---清风
  • 大模型,多模态大模型面试问题记录24/10/25
  • 每日OJ题_牛客_小红的ABC_暴力/找规律_C++_Java
  • 了解AIGC——自然语言处理与生成
  • 大学新生入门编程的推荐路径
  • 神经架构搜索:自动化设计神经网络的方法
  • 深入理解JAVA虚拟机(一)
  • 全面解读 @Transactional 的传播机制:一次搞懂 Spring 事务的各种“传播方式”!
  • 常用设计模式...
  • 【Vulnhub靶场】DC-4
  • 2024高等代数【南昌大学】
  • 用kali入侵 DarkHole_2测试
  • 小白直接冲!一区蛇群优化算法+双向深度学习+注意力机制!SO-BiTCN-BiGRU-Attention多输入单输出回归预测
  • 安全见闻-web安全
  • 【Vue 3】全面解析Composition API的实战技巧
  • Python 从入门到实战40(数据分析概述)
  • C# async-await循环依赖梳理
  • 第四期书生大模型实战营(【入门岛】- 第2关 | Python 基础知识 )