题目链接

题意 : 给你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. 015:索引、B+树

    一. 索引 1. 索引的定义 索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单.索引的作用 ...

  2. python 源代码保护 之 xx.py -> xx.so

    前情提要 之前由于项目的需要,需要我们将一部分“关键代码”隐藏起来. 虽然Python 先天支持 将源代码 编译后 生成 xxx.pyc 文件,但是破解起来相当容易 -_-!! 于是搜罗到了另外一种方 ...

  3. 侯捷 c++面向对象程序设计

    基础知识 基于对象:Object Based 面对的是单一class的设计. 面向对象:Object Oriented 面对的是多重classes的设计,涉及到类和类之间的关系. 课程中设计到两种不同 ...

  4. oracle用户解锁

    创建一个概要文件 create profile frank_profile limit    SESSIONS_PER_USER  5    IDLE_TIME  2    FAILED_LOGIN_ ...

  5. Confluence 5.4.2安装

    默认安装路径 /opt/atlassian/confluence/bin Confluence是Atlassian公司出品的团队协同与知识管理工具. Confluence是一个专业的企业知识管理与协同 ...

  6. KEGG Pathway Anonatation

    转载于 Original 2017-06-20 liuhui 生信百科 KEGG 数据库中,把功能相似的蛋白质归为同一组,然后标上 KO 号.通过相似性比对,可以为未知功能的蛋白序列注释上 KO 号. ...

  7. Tkinter Radiobutton

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

  8. 函数~匿名方法~lambda的逐渐过渡思想

    前提:基于委托实现 (1)使用函数名称 delegate void Printer(string s);//(1)申明委托 static void Main(string[] args) { //(3 ...

  9. 咱妈说别乱点链接之浅谈CSRF攻击

    平时经常听到人们说别乱点链接,小心有病毒.还有长辈们转发的“天呐~XXX的阴谋,全是病毒”.“XXX惊天大病毒,点了苹果手机就要爆炸!”.“现在转发热门连接会乱扣费!千万别点!”. 到底长辈们说的这些 ...

  10. C#获取外网IP、本机MAC地址及Ping的实现

    原文 获取外网IP, C#获取本机的MAC地址,C#通过编程方式实现Ping 获取外网IP地址 思路是通过WebRequest连接一些网上提供IP查询服务的网站,下载到含有你的IP的网页,然后用正则表 ...