题目链接

题意 : 给你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求最小步数 打印路径)的更多相关文章

  1. HDU 1104 Remainder(BFS 同余定理)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1104 在做这道题目一定要对同余定理有足够的了解,所以对这道题目对同余定理进行总结 首先要明白计算机里的 ...

  2. hdu - 1104 Remainder (bfs + 数论)

    http://acm.hdu.edu.cn/showproblem.php?pid=1104 注意这里定义的取模运算和计算机的%是不一样的,这里的取模只会得到非负数. 而%可以得到正数和负数. 所以需 ...

  3. HDU 1104 Remainder (BFS(广度优先搜索))

    Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. HDU 1104 Remainder( BFS(广度优先搜索))

    Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)

    题目链接 题意:4*4的黑白棋,求把棋全变白或者全变黑的最小步数. 分析:以前用状态压缩做过. 和上题差不多,唯一的不同是这个终态是黑棋或者白棋, 但是只需要把给的初态做不同的两次处理就行了. 感觉现 ...

  6. ZOJ 3593 One Person Game(拓展欧几里得求最小步数)

    One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple ...

  7. One Person Game(扩展欧几里德求最小步数)

    One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple ...

  8. 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 ...

  9. HDU 1104 Remainder (BFS)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1104 题意:给你一个n.m.k,有四种操作n+m,n-m,n*m,n%m,问你最少经过多少步,使得最后 ...

随机推荐

  1. Mac运维安装软件

    Maccrt软件 sudo spctl --master-disable 打开软件,复制到app,按照sn.txt输入即可 sudo spctl --master-enable crt快捷键crtl ...

  2. 《Java核心技术》 -- 读书笔记 ② - 类 | 对象 | 接口

    对象vs对象变量 “对象” 描述的是一个类的具体实例,他被java虚拟机分配在 "堆" (Heap)中. “对象变量” 为一个对象的引用(对象变量的值=记载着具体对象的位置/地址) ...

  3. 【POJ】2385 Apple Catching(dp)

    Apple Catching Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13447   Accepted: 6549 D ...

  4. 检测SqlServer服务器性能

    通过性能监视器监视 Avg. Disk Queue Length   小于2 Avg. Disk sec/Read , Avg. Disk sec/Write  小于10ms 可以用数据收集器定时收集 ...

  5. ASP.NET MVC5入门指南

    1.创建项目 文件 --> 新建 --> 项目 Visual C# --> Web --> ASP.NET Web应用程序 MVC此时处于选中状态,勾选“添加单元测试”(可选择 ...

  6. jQuery样式与动画

    修改内联CSS .css() 获取 //取得单个属性的值,传入'属性名',返回"value" .css('property') //取得多个属性的值,传入'['属性1','属性2' ...

  7. Tkinter Radiobutton

    Python GUI - Tkinter Radiobutton: 这个小部件实现了多项选择按钮,这是一种方式向用户提供许多可能的选择,让用户选择只是其中之一.   这个小部件实现了多项选择按钮,这是 ...

  8. 自适应共振理论网络 ART

    引言 自适应共振理论的发源与现状 1976年, 美国 Boston 大学学者 G. A.Carpenter 提出自适应共振理论(Adaptive Res-onance Theory , ART ), ...

  9. 03-23 MVC框架(以查询、删除为例)

    1.MVC的定义: MVC(Model-View-Controller,模型-视图-控制器)是用于将应用程序粉好吃呢过如下3个主要方面的体系结构模式: 模型(Model):一组类和业务规则,类用于描述 ...

  10. 查看win激活状态的命令

    查看win激活状态的命令  1.键盘按下win+R 运行输入如下命令即可. 2.Win+R===>输入 slmgr.vbs -dlv   显示:最为详尽的激活信息,包括:激活ID.安装ID.激活 ...