题意:给出u,v,p,对u可以进行三种变化: 1.u=(u+1)%p ; 2.u = (u+p-1)%p;  3.u = 模p下的逆元。问通过几步可以使u变成v,并且给出每一步的操作。

分析:朴素的bfs或dfs会超时或炸栈,考虑用双向bfs头尾同时搜。用map存每个数的访问状态和对应的操作编号,正向搜步长为正,反向搜步长为负。反向搜的时候要注意对应加减操作是反过来的。

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<iostream>
#include<queue>
#include<map>
#include<string>
#include<stack>
using namespace std;
typedef long long LL;
const int maxn =;
const int INF=0x3f3f3f3f;
struct Node{
int step, but;
LL pre;
};
map<LL,Node> path;
LL u,v,p; LL fpow(LL a,LL n)
{
LL res=;
while(n){
if(n&) res =(res*a)%p;
a = a*a %p;
n>>=;
}
return res;
} void Print(LL a,LL b,int op)
{
printf("%d\n",path[a].step--path[b].step);
stack<int> S;
while(a!=u){
Node ap = path[a];
S.push(ap.but);
a = ap.pre;
}
while(!S.empty()){
int x =S.top();S.pop();
printf("%d ",x);
}
printf("%d ",op);
while(b!=v){
Node bp =path[b];
printf("%d ",bp.but);
b = bp.pre;
}
puts("");
} void BFS()
{
path.clear();
path[u]=(Node){,-,-};
path[v]=(Node){-,-,-};
queue<LL> qf,qb;
qf.push(u); qb.push(v);
while(!qf.empty()|| !qb.empty()){
if(!qf.empty()){
LL x = qf.front(); qf.pop();
Node xp = path[x];
LL next = (x+)%p;
Node np = path[next];
if(np.step==){ //未访问
path[next]= (Node){xp.step+,,x};
qf.push(next);
}
else if(np.step<){ //相遇
Print(x,next,);
return;
} next = (x+p-) %p; //op2
np = path[next];
if(np.step==){
path[next]= (Node){xp.step+,,x};
qf.push(next);
}
else if(np.step<){
Print(x,next,);
return;
} next = fpow(x,p-);
np = path[next];
if(np.step==){
path[next] = (Node){xp.step+,,x};
qf.push(next);
}
else if(np.step<){
Print(x,next,);
return;
}
} if(!qb.empty()){
LL x = qb.front(); qb.pop();
Node xp = path[x]; LL next = (x+p-)%p;
Node np = path[next];
if(!np.step){
path[next] = (Node){xp.step-,,x};
qb.push(next);
}
else if(np.step>){
Print(next,x,);
return;
} next = (x+)%p;
np = path[next];
if(!np.step){
path[next] = (Node){xp.step-,,x};
qb.push(next);
}
else if(np.step>){
Print(next,x,);
return;
} next = fpow(x,p-);
np = path[next];
if(!np.step){
path[next] = (Node){xp.step-,,x};
qb.push(next);
}
else if(np.step>){
Print(next,x,);
return;
}
}
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int N,M,tmp,T;
while(scanf("%lld %lld %lld",&u,&v,&p)==){
if(u==v){
puts("");
continue;
}
BFS();
}
return ;
}

CodeForces - 995E Number Clicker (双向BFS)的更多相关文章

  1. CF995E Number Clicker (双向BFS)

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

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

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

  3. Codeforces 995 E - Number Clicker

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

  4. HDU 3085 Nightmare Ⅱ (双向BFS)

    Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  5. Hdu1401-Solitaire(双向bfs)

    Solitaire is a game played on a chessboard 8x8. The rows and columns of the chessboard are numbered ...

  6. UVA1601-The Morning after Halloween(双向BFS)

    Problem UVA1601-The Morning after Halloween Accept: 289 Submit: 3136 Time Limit: 12000 mSec  Problem ...

  7. Eight (HDU - 1043|POJ - 1077)(A* | 双向bfs+康拓展开)

    The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've see ...

  8. HDU3085(双向BFS+曼哈顿距离)题解

    Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. POJ-3131-Cubic Eight-Puzzle(双向BFS+哈希)

    Description Let's play a puzzle using eight cubes placed on a 3 × 3 board leaving one empty square. ...

随机推荐

  1. 网络I/O:Socket→RMI

    ★Socket Socket编程可能大家都很熟,所以就不多讨论了,只是说通过socket把数据保存到远端服务器或从网络socket读取数据也不失为一种值得考虑的方式. ★RMI RMI机制其实就是RP ...

  2. 【BZOJ】1680: [Usaco2005 Mar]Yogurt factory(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1680 看不懂英文.. 题意是有n天,第i天生产的费用是c[i],要生产y[i]个产品,可以用当天的也 ...

  3. TaoKeeper

    基于zookeeper的监控管理工具taokeeper,由淘宝团队开源的zk管理中间件: 按照taokeeper官方说明 http://jm-blog.aliapp.com/?p=1450 下载tao ...

  4. java的Date类型转换为MySQL数据库的Date类型

    最近遇到一个问题,需要把java中的日期类型存放为MySQL数据库的日期类型,两个日期之间需要进行转化才能进行存储,转化代码如下: package com.alphajuns.demo1; impor ...

  5. ssh框架搭建出现的问题和解决

    [说明]今天尝试从头开始搭建ssh 框架, 真心是有点不太容易,可能是第一次吧,之前都是小打小闹. 一:今日完成 搭建 Spring 环境 --> 然后搭建 Hibernate 环境 --> ...

  6. Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成

    作者:zyl910 手工写文档是一件苦差事,幸好现在有从源码中抽取注释生成文档的专用工具.对于Objective-C来说,目前最好用的工具是appledoc和doxygen.可是这两种工具对于注释的要 ...

  7. linux一台机器文件传到另一台机器上

    登录一台机器35.73: scp -P 端口 要传的文件 user@xxx.xxx.xxx.xxx:/目标文件夹/ 例子 :scp -r -P3561 /home/ismp/build/app/bec ...

  8. [刷题]ACM ICPC 2016北京赛站网络赛 D - Pick Your Players

    Description You are the manager of a small soccer team. After seeing the shameless behavior of your ...

  9. Spoken English Practice(I won't succumb to you, not ever again)

    绿色:连读:                  红色:略读:               蓝色:浊化:               橙色:弱读     下划线_为浊化 口语蜕变(2017/6/28) ...

  10. luarocks错误 require ‘luasql.mysql' 报module 'luasql.mysql' not found:

    错误: require 'luasql.mysql'stdin:1: module 'luasql.mysql' not found: no field package.preload['luasql ...