题目分析

首先,我们必须明白,操作都是互逆的,\(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的更多相关文章

  1. CF995E Number Clicker 解题报告

    CF995E Number Clicker 题目描述 Allen is playing Number Clicker on his phone. He starts with an integer u ...

  2. CF995E Number Clicker (双向BFS)

    题目链接(洛谷) 题目大意 给定两个数 \(u\) , \(v\) .有三种操作: \(u=u+1(mod\) \(p)\) . \(u=u+p−1(mod\) \(p)\) . \(u=u^{p−2 ...

  3. Codeforces 995 E - Number Clicker

    E - Number Clicker 思路:双向搜索 代码: #include<bits/stdc++.h> using namespace std; #define fi first # ...

  4. Number Clicker CodeForces - 995E(双向bfs)

    双向bfs  注意数很大  用map来存 然后各种难受....

  5. Number Clicker CodeForces - 995E (中途相遇)

    链接 大意: 给定模数$p$, 假设当前在$x$, 则可以走到$x+1$, $x+p-1$, $x^{p-2}$ (mod p), 求任意一条从u到v不超过200步的路径 官方题解给了两个做法, 一个 ...

  6. 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 ...

  7. [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 ...

  8. 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 ...

  9. JavaScript Math和Number对象

    目录 1. Math 对象:数学对象,提供对数据的数学计算.如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. 2. Number 对象 :Js中提供数字的对象.包含整数.浮 ...

随机推荐

  1. 将前端请求中的数据绑定到Spring MVC响应方法中参数的四种方法

    一.映射URL绑定的占位符到方法参数 1.方法 使用@PathVariable注解 2.代码示例 a.接收请求方法 @RequestMapping(value = "/deleteInfo/ ...

  2. Unity实现“笼中窥梦”的渲染效果

    效果 思路 5个面用5个RenderTexture来接受5个摄像机分别获取的小场景图像: RenderTexture就当成屏幕来理解,MainCamera是把画面显示在屏幕上,屏幕就是最大的Rende ...

  3. iOS 实现简单的界面切换

    以下是在iOS中最简单的界面切换示例.使用了多个Controller,并演示Controller之间在切换界面时的代码处理. 实现的应用界面: 首先,创建一个window-based applicat ...

  4. 象群游牧算法--EHO

    象群游牧算法的数学模型 象群的游牧行为非常复杂,但是其中一些行为可以帮助我们寻找全局最优解和局部最优解.对此,进行数学建模为: (1) 象群的每个部落都有固定数目的大象: (2) 每次迭代中,部落中都 ...

  5. 为什么众多软件厂商无法提供APS高级计划排程系统?工厂目前生产计划是怎么排产的?

    一.行业现状如想了解一下目前现状,去考察一下上了ERP的企业,会发现一个有趣的现象该企业无论ERP软件搞得如何如火如荼,似乎都与生产调度人员无关. 车间里或者生产线上的生产作业计划.生产过程的调度和管 ...

  6. 报错:cannot access com.google.protobuf.GeneratedMessageV3

    引入依赖 <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobu ...

  7. C/C++ byte 转 int 有符号数,转成Int 无符号数

    p.p1 { margin: 0; font: 12px "Helvetica Neue"; color: rgba(69, 69, 69, 1); min-height: 14p ...

  8. ubuntu无法找到ifconfig(command not found: ifconfig)

    演示环境 $ uname -a Linux xxxxx-xxxxx-xxxx5.4.0-47-generic #51-Ubuntu SMP Fri Sep 4 19:50:52 UTC 2020 x8 ...

  9. 【LeetCode】422. Valid Word Square 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 拼接出每一列的字符串 日期 题目地址:https:// ...

  10. 【LeetCode】345. Reverse Vowels of a String 解题报告(Java & Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用栈 双指针 日期 [LeetCode] 题目地址 ...