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,并且给出每一步的操作。
分析:朴素的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)的更多相关文章
- CF995E Number Clicker (双向BFS)
题目链接(洛谷) 题目大意 给定两个数 \(u\) , \(v\) .有三种操作: \(u=u+1(mod\) \(p)\) . \(u=u+p−1(mod\) \(p)\) . \(u=u^{p−2 ...
- Number Clicker CodeForces - 995E(双向bfs)
双向bfs 注意数很大 用map来存 然后各种难受....
- Codeforces 995 E - Number Clicker
E - Number Clicker 思路:双向搜索 代码: #include<bits/stdc++.h> using namespace std; #define fi first # ...
- HDU 3085 Nightmare Ⅱ (双向BFS)
Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Hdu1401-Solitaire(双向bfs)
Solitaire is a game played on a chessboard 8x8. The rows and columns of the chessboard are numbered ...
- UVA1601-The Morning after Halloween(双向BFS)
Problem UVA1601-The Morning after Halloween Accept: 289 Submit: 3136 Time Limit: 12000 mSec Problem ...
- 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 ...
- HDU3085(双向BFS+曼哈顿距离)题解
Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 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. ...
随机推荐
- C语言 百炼成钢25
/* 题目61:编写一个名为removestring的函数,该函数用于从一个字符串中删除一定量的字符. 该函数接受三个参数: 第1参数代表源字符串 第2参数代表需要删除字符的起始位置(位置从0开始) ...
- 关于JS中的constructor与prototype{转}
http://www.cnblogs.com/qiantuwuliang/archive/2011/01/08/1930548.html http://www.cnblogs.com/yupeng/a ...
- SourceTree --转载 SourceTree大文件上传提示POST git-receive-pack (chunked)相关问题记录
前两天,更新了百度地图的SDK,更新完了通过SourceTree上传到Github 结果提示 :POST git-receive-pack (chunked), 在网上查询之后了解到这个提示的原因是因 ...
- JDBC批量操作性能提升
JDBC 当使用INSERT INTO....VALUES()语句批量插入的时候,应该使用JDBC的PreparedStatement的批量操作方法,而不是採用一条一条运行的方法. 比如(来源:htt ...
- jvm相关參数,调优
常见的jvm參数例如以下 -Xmx1024m:设置JVM最大可用内存为1024M. -Xms1024m:设置JVM初始内存为1024m. 此值能够设置与-Xmx同样,以避免每次垃圾回收完毕后JVM又一 ...
- c++ 指针(不断更新)
c++指针只能说博大精深,在用的时候感觉好晕 1.指针类型转换 /* 在指针的强制类型转换:ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的类型)大于sizeof(ptr1的类型), ...
- Webphere WAS 启动
如果WebSphere是默认安装的话,是自带两个profile,Dmgr和AppSrv,只需要到指定目录下启动管理器和节点即可/usr/IBM/WebSphere/AppServer/profiles ...
- 【BZOJ2927】[Poi1999]多边形之战 博弈
[BZOJ2927][Poi1999]多边形之战 Description 多边形之战是一个双人游戏.游戏在一个有n个顶点的凸多边形上进行,这个凸多边形的n-3条对角线将多边形分成n-2个三角形,这n- ...
- 使用Dell R710 IDRAC挂载虚拟介质
Dell DRAC,虚拟介质分离或所选虚拟磁盘驱动器的虚拟介质重定向已由另一用户使用 DELL Idrac 一台Dell的R710服务器,远程管理器后发现虚拟介质无法映射,一直提示“虚拟介质分离或所选 ...
- 【Linux command reference】
ubuntu16.04安装中文输入法: https://blog.csdn.net/singleyellow/article/details/77448246 ubuntu16.04 用vi编辑代码, ...