HDU 1104 Remainder (BFS求最小步数 打印路径)
题意 : 给你N,K,M,N可以+,- ,*,% M,然后变为新的N,问你最少几次操作能使(原来的N+1)%K与(新的N)%k相等。并输出相应的操作。
思路 : 首先要注意题中给的%,是要将负数变为正数的,所以取余的时候要注意,又因为各种问题……
% 的问题是:a mod b = (a % b + b) % b,不是平常的取余。
讨论里有个人是这样说的:
关于此题的用bfs搜索,大家都是知道的。
既然使用了bfs,则队列是少不了的,为了叙述的方便,记运算符集合
oper = {+,-,*,%}, op = {+,-,*}, pe = {+,-,%}。
N在经过一些列的运算,可能会很大,所以溢出问题,需要考虑充分。
因为最后比较的是两个数对k取余是否相等,因此,在队列中存储对
k取余后的值,各种文章中谈论的都是
((n oper m)%k oper m)%k 是不是等于(n oper m oper m)%k
对于op运算是成立的,但是%参与时,结果是不等。例如:
记n = 2, m = 8, k =3.
则((n * m)%k % m)%k = 1
而(n * m % m)%k = 0。
关于另一个结论:%只能出现在第一个位置或者出现在*的后面,且%最多只能出现两次。
因为对任意n,( n pe m ) % m = n % m. 对于乘法则是不一定的,n * m % m 必为0。
由于一系列{+,-,%}运算相当于在n的基础上,‘+’相当于加上若干个m,‘-’相当于减去若干
个m,‘%’相当于一次同时减去(或者加上)若干个m。而他们的总和带来的结果就是n的变化是
m的整数倍,所以上面的式子相等。也就是说如果有一个序列中有‘%’,则它的前面要么是空的,
要么是‘*’,因为如果是其他的只会使得操作序列更长。例如:
+-+-+++%+*+-*-*可以变成%+*+-*-*,后者比前者更短。
*%+-+-***-+*%+*这样的路径也是不存在的,因为*%使得n为0,而后面的*%也为0,
重复,所以不会入队列的。
因为‘%’出现的情况很有限,并且出现的位置,也可以知道。特殊处理一下,就可以了。其他的
对k取余没有问题。
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <queue>
using namespace std ; struct node
{
int step ;
int an ;
string ch ;
} p,q,temp;
int vis[] ;
int n,m,k,km ;
void bfs()
{
queue<node>Q ;
memset(vis,,sizeof(vis)) ;
p.an = (n % km) + km ;
vis[p.an] = ;
p.step = ;
Q.push(p) ;
while(!Q.empty())
{
q = Q.front();
Q.pop();
if(q.an % k == ((n + ) % k + k)%k )
{
printf("%d\n",q.step) ;
cout<<q.ch<<endl;
return ;
}
int x = q.an;
temp.step = q.step + ;
for(int i = ; i < ; i++)
{
if(i == )
{
temp.an = (x+m) % km;
temp.ch = q.ch+'+' ;
}
else if(i == )
{
temp.an = ((x-m)%km+km)%km;
temp.ch = q.ch+'-' ;
}
else if(i == )
{
temp.an = (x*m)%km;
temp.ch = q.ch+'*' ;
}
else if(i == )
{
temp.an = (x%m)%km;
temp.ch = q.ch+'%' ;
}
if(!vis[temp.an])
{
Q.push(temp) ;
vis[temp.an] = ;
}
}
}
printf("0\n") ;
} int main()
{ while(~scanf("%d %d %d",&n,&k,&m))
{
if(n == && m == && k == ) break ;
km = k*m ;
bfs() ;
}
return ;
}
HDU 1104 Remainder (BFS求最小步数 打印路径)的更多相关文章
- HDU 1104 Remainder(BFS 同余定理)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1104 在做这道题目一定要对同余定理有足够的了解,所以对这道题目对同余定理进行总结 首先要明白计算机里的 ...
- hdu - 1104 Remainder (bfs + 数论)
http://acm.hdu.edu.cn/showproblem.php?pid=1104 注意这里定义的取模运算和计算机的%是不一样的,这里的取模只会得到非负数. 而%可以得到正数和负数. 所以需 ...
- HDU 1104 Remainder (BFS(广度优先搜索))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDU 1104 Remainder( BFS(广度优先搜索))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)
题目链接 题意:4*4的黑白棋,求把棋全变白或者全变黑的最小步数. 分析:以前用状态压缩做过. 和上题差不多,唯一的不同是这个终态是黑棋或者白棋, 但是只需要把给的初态做不同的两次处理就行了. 感觉现 ...
- ZOJ 3593 One Person Game(拓展欧几里得求最小步数)
One Person Game Time Limit: 2 Seconds Memory Limit: 65536 KB There is an interesting and simple ...
- One Person Game(扩展欧几里德求最小步数)
One Person Game Time Limit: 2 Seconds Memory Limit: 65536 KB There is an interesting and simple ...
- hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- HDU 1104 Remainder (BFS)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1104 题意:给你一个n.m.k,有四种操作n+m,n-m,n*m,n%m,问你最少经过多少步,使得最后 ...
随机推荐
- canvas之旋转一条线段
<canvas id="canvas" width="600" height="500" style="background ...
- 【洛谷】P1313 计算系数(快速幂+杨辉三角)
题目 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b , ...
- kafka 高可靠
1.集群高可靠 ①搭建kafka集群(略) ②重点配置项(每个broker配置相同,只有broker.id不一样) broker.id=1 当前机器在集群中的唯一标识,和zookeeper的m ...
- [Python] Regular Expressions
1. regular expression Regular expression is a special sequence of characters that helps you match or ...
- Python2.x与Python3.x同时安装时,切换使用方法
Windows环境下允许同时安装Python2.x与Python3.x 一.在命令提示符下使用python2.x或者python3.x可以使用如下方法: 1.找到python的安装目录 2.重命名应用 ...
- cobalt strike 第一节连接到团队的服务器
介绍:Cobalt Strike 一款以metasploit为基础的GUI的框架式渗透工具,集成了端口转发.服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,jav ...
- python开发_python中的module
在python中,我们可以把一些功能模块化,就有一点类似于java中,把一些功能相关或者相同的代码放到一起,这样我们需要用的时候,就可以直接调用了 这样做的好处: 1,只要写好了一个功能模块,就可以在 ...
- C# 设计模式-单例模式(Singleton)
所谓单例模式即所谓的一个类只能有一个实例,说白了,也就是类只能在内部实例一次,然后提供这一实例,外部无法对此类实例化. 单例模式的特点: 1.只能有一个实例: 2.只能自己创建自己的唯一实例: 3.必 ...
- mysql 随机查询 记录集
有时候需求需要随机从数据库查询若干条记录集,网上搜了一下,几篇博文都是些重复的.....不知道他们谁抄的谁的,这里除了介绍提供一种笔者自己想到的方法,本质都是利用mysql 的rand() 第一种方法 ...
- FFmpeg库简介
1.FFmpeg基本组成 FFmpeg框架的基本组成包含AVFormat.AVCodec.AVFilter.AVDevice.AVUtils等模块库,如下图所示. libavformat:用于各种音视 ...