CF995E Number Clicker
题目分析
首先,我们必须明白,操作都是互逆的,\(1,2\)之间是可以互相转化的,这是不需证明的,对于操作\(3\),实际上,是求当前数的逆元,我们知道,逆元就是求当前数在模另一个数下的倒数,那么,逆元的逆元就是他本身也就是倒数的倒数
于是,所有的操作是可以转化的,对于搜索,其实就有用双向\(bfs\)的依据
采用此算法,需要注意,反向的操作需要转化为现在的正向操作
其实,一共也不会运算超过五秒的时间
#include <bits/stdc++.h>
using namespace std;
long long Pow(long long a, long long b, long long mod) {
long long base = a;
long long ans = 1;
while (b) {
if (b & 1) {
ans *= base;
ans %= mod;
}
base *= base;
base %= mod;
b >>= 1;
}
return ans;
}
long long u, v, p;
struct node {
long long sta;
int op;
vector<int> opera;
};
map<long long, int> vis[5];
vector<int> last1, last2;
map<long long, vector<int> > step[5];
void Bfs_Both() {
queue<node> q;
node A;
A.sta = u;
A.op = 0;
q.push(A);
vis[0][A.sta] = 1;
node B;
B.sta = v;
B.op = 1;
vis[1][B.sta] = 1;
q.push(B);
while (q.size()) {
node temp = q.front();
q.pop();
if (vis[(temp.op == 1) ? 0 : 1][temp.sta]) {
last1 = step[0][temp.sta];
last2 = step[1][temp.sta];
return;
}
node ply;
ply = temp;
ply.sta = (temp.sta + 1) % p;
if (!vis[ply.op][ply.sta]) {
vis[ply.op][ply.sta] = 1;
ply.opera.push_back(1);
step[ply.op][ply.sta] = ply.opera;
q.push(ply);
ply.opera.pop_back();
}
ply.sta = (temp.sta - 1 + p) % p;
if (!vis[ply.op][ply.sta]) {
vis[ply.op][ply.sta] = 1;
ply.opera.push_back(2);
step[ply.op][ply.sta] = ply.opera;
q.push(ply);
ply.opera.pop_back();
}
ply.sta = Pow(temp.sta, p - 2, p);
if (!vis[ply.op][ply.sta]) {
vis[ply.op][ply.sta] = 1;
ply.opera.push_back(3);
step[ply.op][ply.sta] = ply.opera;
q.push(ply);
ply.opera.pop_back();
}
}
}
int main() {
scanf("%lld %lld %lld", &u, &v, &p);
Bfs_Both();
printf("%d\n", last1.size() + last2.size());
for (int i = 0; i < last1.size(); i++) {
printf("%d ", last1[i]);
}
for (int i = last2.size()-1; i >=0 ; i--) {
if(last2[i]==1)
{
printf("2 ");
}
else if(last2[i]==2)
{
printf("1 ");
}
else
{
printf("%d ", last2[i]);
}
}
}
CF995E Number Clicker的更多相关文章
- CF995E Number Clicker 解题报告
CF995E Number Clicker 题目描述 Allen is playing Number Clicker on his phone. He starts with an integer u ...
- CF995E Number Clicker (双向BFS)
题目链接(洛谷) 题目大意 给定两个数 \(u\) , \(v\) .有三种操作: \(u=u+1(mod\) \(p)\) . \(u=u+p−1(mod\) \(p)\) . \(u=u^{p−2 ...
- Codeforces 995 E - Number Clicker
E - Number Clicker 思路:双向搜索 代码: #include<bits/stdc++.h> using namespace std; #define fi first # ...
- Number Clicker CodeForces - 995E(双向bfs)
双向bfs 注意数很大 用map来存 然后各种难受....
- Number Clicker CodeForces - 995E (中途相遇)
链接 大意: 给定模数$p$, 假设当前在$x$, 则可以走到$x+1$, $x+p-1$, $x^{p-2}$ (mod p), 求任意一条从u到v不超过200步的路径 官方题解给了两个做法, 一个 ...
- CodeForces - 995E Number Clicker (双向BFS)
题意:给出u,v,p,对u可以进行三种变化: 1.u=(u+1)%p ; 2.u = (u+p-1)%p; 3.u = 模p下的逆元.问通过几步可以使u变成v,并且给出每一步的操作. 分析:朴素的b ...
- [Google Code Jam (Qualification Round 2014) ] B. Cookie Clicker Alpha
Problem B. Cookie Clicker Alpha Introduction Cookie Clicker is a Javascript game by Orteil, where ...
- Google Code Jam 2014 资格赛:Problem B. Cookie Clicker Alpha
Introduction Cookie Clicker is a Javascript game by Orteil, where players click on a picture of a gi ...
- JavaScript Math和Number对象
目录 1. Math 对象:数学对象,提供对数据的数学计算.如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. 2. Number 对象 :Js中提供数字的对象.包含整数.浮 ...
随机推荐
- 【Services】【Web】【apr】安装apr
1. 基础: 1.1 描述:apr全称Apache Portable Runtime,常用于与ssl相关的环境支持,比如openssl,httpd,nginx,tomcat 1.2 链接: 官方网站: ...
- 移动端(App)项目进行满屏高度的设置
做移动端App的时候 高度一般会根据页面的元素进行自动设置,不会铺满整个屏幕.通过以下代码实现满屏高度. #app{ width: 100%; height: 100%; position: abso ...
- 云服务器ECS部署和卸载RabbitMQ
云服务器ECS部署RabbitMQ RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件,用于在分布式系统中存储转发消息,有良好的易用性.扩展性和高可用性.本文介绍如何通过ECS实例 ...
- 05 - Vue3 UI Framework - Button 组件
官网基本做好了,接下来开始做核心组件 返回阅读列表点击 这里 目录准备 在项目 src 目录下创建 lib 文件夹,用来存放所有的核心组件吧.然后再在 lib 文件夹下创建 Button.vue 文件 ...
- HGAME pwn ROP_LEVEL2
花了好多天,终于把这个题彻底弄懂了...自己太菜了 下载文件,首先checksec检查一下保护. 只开启了堆栈不可执行,接下来拖到IDA看一下C的伪代码. 大致先让你输入,然后再次让你输入. 第 ...
- rinted端口转发
https://www.cnblogs.com/linuxk/p/10075803.html 阿里云Redis外网转发访问 1.前提条件 如果您需要从本地 PC 端访问 Redis 实例进行数据操 ...
- C++ 11 新特性:函数声明auto
1.概览 1.1 函数名中的箭头,用来表明函数的return type,其使用在函数的返回类型需要通过模板参数进行推导,使用在decltype()和declval()不方便的场景 2.正文 c++ 中 ...
- JuiceFS 数据加密原理
JuiceFS 作为分布文件系统,每天与海量的数据打着交道,因此数据的安全性尤为关键,今天就来介绍一下 JuiceFS 在数据加密方面所做的努力. 传输中数据加密 JuiceFS 在网络上传输时会对数 ...
- lldb调试C++总结(3)
note 本文将弥补之前的遗漏部分. continue 前面提到,当设置断点后,使用step和next和finish,程序会停下来,需要程序继续运行,键入continue, 程序可自动继续向下执行. ...
- 【LeetCode】Balanced Binary Tree 算法优化 解题报告
Balanced Binary Tree Better Solution [LeetCode] https://leetcode.com/submissions/detail/40087813/ To ...