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中提供数字的对象.包含整数.浮 ...
随机推荐
- webpack配置(vue)
Vue-loader Vue-loader 是一个加载器,能把 .vue 文件转换为js模块. Vue Loader 的配置和其它的 loader 不太一样.除了将 vue-loader 应用到所有扩 ...
- 2.使用Lucene开发自己的搜索引擎–indexer索引程序中基本类介绍
(1)Directory:Directory类描述了Lucene索引的存放位置,它是一个抽象,其子类负责具体制定索引的存储路径.FSDirectory.open方法来获取真实文件在文件系统中的存储路径 ...
- PowerDotNet平台化软件架构设计与实现系列(06):定时任务调度平台
定时任务是后端系统开发中少不了的一个基本必备技能. 传统的实现定时任务的方式有很多种,比如直接使用操作系统的Timer和TaskSchedule,或者基于Quartz.HangFire.xxl-job ...
- Oracle命名规则
1.长度不能超过三十个字符 2. 不要使用Oracle关键字 比如:id name table 3. 不能使用数字开头 包含:数字 字母 下划线 美元符号 4. 建议用 英文单词,不要去用中 ...
- Shell 语法和tips -- 持续更新
1. 字符串掐头去尾 #, % 例如:x=aabbaarealwwvvwwecho "${x%w*w}"aabbaarealwwvv echo "${x%%w*w}&qu ...
- LuoguP6857 梦中梦与不再有梦 题解
Update \(\texttt{2020.10.20}\) 增加了证明.感谢@东北小蟹蟹(dbxxxqwq)的提醒. Content 有一个 \(n\) 个点的无向图,每两个点之间都有一条边直接相连 ...
- vim 默认配置
vim ~/.vimrc 然后输入常用的需要用的命令,然后保存,这个每次启动VIM都会自动配置.当然你也可以在VIM里面按":"之后输入如下命令,但是下次启动之后设置就会丢失了. ...
- IDEA报错 Unable to open debugger port (127.0.0.1:63342): java.net.BindException "Address already in use
Unable to open debugger port (127.0.0.1:63342): java.net.BindException "Address already in use ...
- java类型转换拓展
数据类型拓展 在Java中二进制用0b开头,八进制用0开头,十六进制用0x表示 整数拓展 int i=10; int i2=010;//八进制 int i3=0x10;//十六进制0x,0-9,A- ...
- c++之sigslot库
关于 本文演示环境: win10 + VS2017 1. demo #include <iostream> #include "sigslot.h" using nam ...