题目分析

首先,我们必须明白,操作都是互逆的,\(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]);
} }
}

最新文章

  1. C语言回顾-整型变量修饰符和一维数组
  2. ubantu14下vim的配置...
  3. Flex 加载dxf
  4. beta版本工作百分比
  5. 关于Qt的事件循环以及QEventLoop的简单使用
  6. SQL Server:在事务中回滚TRUNCATE操作
  7. 【linux】windows和linux编码相互转换
  8. java 宠物商店代码
  9. (KEIL)MDK5安装与JLINK问题解决方法(支持代码自动补全)
  10. php判断是否为手机客户端
  11. rsyslog VS syslog-ng,日志记录哪家强?
  12. httpclient总结
  13. 7、js使用正则表达式验证
  14. 【BZOJ4736】温暖会指引我们前行(Link-Cut Tree)
  15. Oracle 的常用概念
  16. C# Skip和Take的简单用法
  17. 微信access_token请求之简单缓存方法封装
  18. 文末有福利 | IT从业者应关注哪些技术热点?
  19. json解析出来数据为空解决方法
  20. Day14作业及默写

热门文章

  1. ssm-book 整合案例
  2. Dubbo应用到web工程
  3. Vue API 4 (过渡和动画)
  4. 南京邮电大学CTF密码学之MD5-golang与php代码实现
  5. Delphi编译报错对照表
  6. RabbitMQ,RocketMQ,Kafka 几种消息队列的对比
  7. Android工具-DDMS
  8. 象群游牧算法-Matlab
  9. [V&amp;N2020 公开赛]babybabypwn
  10. CF1077A Frog Jumping 题解