hdu Remainder
这道题是道很明显的bfs题。因为对数论没什么研究 ,所以这道题目里的两个关键点并不知道,看了别人的题解才知道 。
1、为避免取模后出现负数,采用:x%y=(x%y+y)%y
2、全部采用对m*k取模后的值作为下标,这个是最关键的。
还要注意操作符的回溯数组,小细节被坑哭。。。
#include"iostream"
#include"stdio.h"
#include"algorithm"
#include"cmath"
#include"string"
#include"string.h"
#include"queue"
#define mx 1000005
using namespace std;
char op[]="+-*%";
//vis用来标记n值是否已出现过,fa[i]记录的是i的前一个操作数,cnt用来记录操作符
int vis[mx],fa[mx],cnt[mx],ope[mx];
int N,K,M; int mod(int a,int b)
{
return (a%b+b)%b;
} void bfs()
{
int mo=K*M,i,cur,next,des,k;
queue<int>q;
while(!q.empty()) q.pop();
memset(vis,,sizeof(vis));
des=mod(N+,K);
int n=mod(N,mo);
vis[n]=;
fa[n]=-;
cnt[n]=-;
q.push(n);
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur%K==des)
{
k=;
while(fa[cur]>=)
{
ope[k++]=cnt[cur];
cur=fa[cur];
}
cout<<k<<endl;
while(k) cout<<op[ope[--k]];//被坑哭这个地方。。。
cout<<endl;
return;
}
for(i=;i<;i++)
{
if (i == )next = (cur + M) % mo;
else if (i == )next = mod(cur - M, mo);
else if (i == )next = cur * M % mo;
else next = cur % M;
if(vis[next]==)
{
vis[next]=;
fa[next]=cur;
cnt[next]=i;
q.push(next);
}
}
}
cout<<<<endl;
}
int main()
{
while(scanf("%d%d%d",&N,&K,&M),K)
{
bfs();
}
return ;
}
hdu Remainder的更多相关文章
- hdu 1788 Chinese remainder theorem again(最小公倍数)
Problem Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,mk两两互素,则下面同余方程组: x≡a1(mod m1) x≡a2( ...
- hdu.1104.Remainder(mod && ‘%’ 的区别 && 数论(k*m))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU 1104 Remainder (BFS)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1104 题意:给你一个n.m.k,有四种操作n+m,n-m,n*m,n%m,问你最少经过多少步,使得最后 ...
- 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 同余定理)
题目链接 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 + 数论)
http://acm.hdu.edu.cn/showproblem.php?pid=1104 注意这里定义的取模运算和计算机的%是不一样的,这里的取模只会得到非负数. 而%可以得到正数和负数. 所以需 ...
- HDU 1104 Remainder
与前一题类似,也是BFS+记录路径, 但是有很多BUG点, 第一MOD操作与%不同i,其实我做的时候注意到了我们可以这样做(N%K+K)%K就可以化为正数,但是有一点要注意 N%K%M!=N%M%K; ...
- HDU 1788 Chinese remainder theorem again
题目链接 题意 : 中文题不详述. 思路 : 由N%Mi=(Mi-a)可得(N+a)%Mi=0;要取最小的N即找Mi的最小公倍数即可. #include <cstdio> #include ...
随机推荐
- pylab模式
启动IPython时ipython --pylab就可以进入pylab模式,这种模式下画图时图片不会直接蹦出来,而是嵌在交互环境中,当然sypder里自动是pylab模式了
- Android的Touch事件处理机制
Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后. Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层. 首先说一 ...
- sql 提取数字、字母、汉字
--提取数字 IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL DROP FUNCTION DBO.GET_NUMBER2 GO )) ) AS BEGIN BE ...
- nginx日志中文变成类型\xE9\xA6\x96\xE9\xA1\xB5-\xE6\x8E\xA8\xE8\x8D\x90的东西
感谢 http://my.oschina.net/leejun2005/blog/106791 代码如下: public class App { public static String str2He ...
- poj 1141 区间dp+递归打印路径
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30383 Accepted: 871 ...
- ajax无刷新异步传输
index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- ios开发-载入viewcontroller的几种方式
Assuming you have storyboard, go to storyboard and give your VC an identifier (inspector), then do: ...
- PHP、Java对称加密中的AES加密方法
PHP AES加密 <?php ini_set('default_charset','utf-8'); class AES{ public $iv = null; public $key = n ...
- WordPress用户注册无法发送密码邮件怎么回事?
wordpress无法发送电子邮件.可能原因:您的主机禁用了 mail() 函数 等等几句话.在网上一搜,很快找到了解决方案:使用wp-mail-smtp插件. 一.插件下载安装.可以在wordpre ...
- MongoDB 入门之基础 DCL
此文章主要记录部分主要的 MongoDB 的 DCL 操作. MongoDB 默认不需要用户名和密码就可以用 mongodb.exe 登录 一.开启 MonogoDB 的权限模式 修改 MongoDB ...