这道题是道很明显的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的更多相关文章

  1. hdu 1788 Chinese remainder theorem again(最小公倍数)

    Problem Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,mk两两互素,则下面同余方程组: x≡a1(mod m1) x≡a2( ...

  2. hdu.1104.Remainder(mod && ‘%’ 的区别 && 数论(k*m))

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

  3. HDU 1104 Remainder (BFS)

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

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

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

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

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

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

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

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

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

  8. HDU 1104 Remainder

    与前一题类似,也是BFS+记录路径, 但是有很多BUG点, 第一MOD操作与%不同i,其实我做的时候注意到了我们可以这样做(N%K+K)%K就可以化为正数,但是有一点要注意 N%K%M!=N%M%K; ...

  9. HDU 1788 Chinese remainder theorem again

    题目链接 题意 : 中文题不详述. 思路 : 由N%Mi=(Mi-a)可得(N+a)%Mi=0;要取最小的N即找Mi的最小公倍数即可. #include <cstdio> #include ...

随机推荐

  1. hdu 4568 Hunter(spfa预处理 + 状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:首先spfa预处理出每对宝藏之间的最短距离以及宝藏到边界的最短距离,然后dp[state] ...

  2. 数字信号处理实验(四)——数字滤波器结构

    一.滤波器结构 1.IIR滤波器 (1)系统函数   (2)差分方程   (3)级联形式:   (4)并联形式   2.FIR滤波器 (1)系统函数   (2)差分方程   (3)级联形式:   (4 ...

  3. hdu 1251 字典树的应用

    这道题看了大神的模板,直接用字典树提交的会爆内存,用stl 里的map有简单有快 #include <iostream> #include <map> #include < ...

  4. JSON.parse()和JSON.stringify()使用

    JSON.parse()用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age&qu ...

  5. css与js后边有?v=20160101

    原文地址http://blog.csdn.net/zanychou/article/details/8813076 <span style="font-size:14px;" ...

  6. Uva 129 Krypton Factor

    0.这道题的输出 处理起来挺麻烦的 以后类似的可以借鉴一下 ;i<cur;i++) { && i%==) printf("\n%c",a[i]); & ...

  7. windows 安装oracle 后,所有服务都是什么意思,需要开户吗?

    中的方法成功安装Oracle 11g后,共有7个服务,这七个服务的含义分别为: 1. Oracle ORCL VSS Writer Service: Oracle卷映射拷贝写入服务,VSS(Volum ...

  8. Spring Boot 集成MyBatis

    http://blog.csdn.net/isea533/article/details/50359390

  9. git 学习笔记4--.gitignore

    很多时候,我们都不希望非源码的文件加入到repository管理. 这时,.gitignore文件就上场了. ignore规则 所有空行或者以注释符号 # 开头的行都会被 Git 忽略. 可以使用标准 ...

  10. unity 播放音乐

    创建一个AudioSource组件,拖一个mp3组件到这个组建上 新建一个脚本,拖audiosource到audiosource的声明上 using UnityEngine; using System ...