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中提供数字的对象.包含整数.浮 ... 
随机推荐
- Spring Batch(0)——控制Step执行流程
			Conditional Flow in Spring Batch I just announced the new Learn Spring course, focused on the fundam ... 
- ubuntu 使用mysql
			一: 安装: sudo apt-get install mysql-serversudo apt-get install mysql-clientsudo apt-get install libmys ... 
- 注册页面css版本
			<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ... 
- Jenkins代码检查
			目录 一.静态代码分析 二.规范检查 PMD进行检查 分析器区别 三.持续代码质量检测 Maven与SonarQube集成 Jenkins与SonarQube集成 代码扫描 SonarQube集成p3 ... 
- [源码解析] PyTorch 分布式(17) --- 结合DDP和分布式 RPC 框架
			[源码解析] PyTorch 分布式(17) --- 结合DDP和分布式 RPC 框架 目录 [源码解析] PyTorch 分布式(17) --- 结合DDP和分布式 RPC 框架 0x00 摘要 0 ... 
- 象群游牧算法-Matlab
			1. 适应度函数: function z=chaffer(x)%chaffer函数x=(0...0) f(x)=0 x[-10,10]%%没测 n=10; s1=0; for i=1:n s1=s1+ ... 
- [BUUCTF]REVERSE——[HDCTF2019]Maze
			[HDCTF2019]Maze 附件 步骤: 例行检查,32位程序,upx壳 upx脱壳儿后扔进32位ida,首先检索程序里的字符串 有类似迷宫的字符串,下面也有有关flag的提示字符串,但是没法进行 ... 
- python selenium表单定位
			在Web应用中经常会遇到frame/iframe 表单嵌套页面的应用,WebDriver 只能在一个页面上对元素识别与定位,对于frame/iframe 表单内嵌页面上的元素无法直接定位.这时就需要通 ... 
- 筛选Table.SelectRows-文本与数值(Power Query 之 M 语言)
			数据源: 包含文本与数值的任意数据 目标: 对文本和数值进行筛选 M公式: = Table.SelectRows( 表, 筛选条件) 筛选条件: 等于:each [指定列] = "指定值&q ... 
- .NET Core工程应用系列(2) 实现可配置Attribute的Json序列化方案
			背景 在这篇文章中,我们实现了基于自定义Attribute的审计日志数据对象属性过滤,但是在实际项目的应用中遇到了一点麻烦.需要进行审计的对象属性中会包含其他类对象,而我们之前的实现是没办法处理这种类 ... 
