这道题是道很明显的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. javascript 时间倒计时

    新加入一个项目的集中开发,遇到一个需要倒计时的需求,经过测试,有以下几种方案,分享出来: 方案一: 页面Html: <span style="font-size:18px;" ...

  2. jq获取后台json并解析

    参考: $(function () { $.ajax({ url: 'tsconfig.json', type: 'GET', dataType: 'json', timeout: 1000, cac ...

  3. 如何查看经过编码的cookie?

    方法1.去在线工具网站(http://tool.oschina.net/encode?type=2)手动复制编码的cookie,转码后查看. 方法2.用火狐浏览器打开网页,如果有历史记录(存在cook ...

  4. C#资源文件与与资源名称字符串之间的互相转化

    1.使用ResourceManager string st = Properties.Resources.ResourceManager.GetString(tableName);value = Pr ...

  5. BZOJ3468 : 滑雪

    根据公式$x^k=\sum_{i=1}^k Stirling2(k,i)i!C(x,i)$, 设$f[i][j][k]$表示从$(i,j)$出发的所有路径的$C(路径长度,k)$的和, 根据$C(n, ...

  6. [转]Maven实现直接部署Web项目到Tomcat7

    From:http://my.oschina.net/angel243/blog/178554 http://yuandingjiema.iteye.com/blog/1752544 以前在项目中很少 ...

  7. HDU 1754区间最值 & SPLAY

    真是亲切的1754啊..第一道傻逼版的线段树做的是这个,后来学了zkw做的是这个,在后来决定打lrj线段树又打了一遍,如今再用splay和老朋友见面   从上到下依次为:加了读入优化的splay,sp ...

  8. 使用TCMalloc优化OpenResty

    1.安装依赖包 yum -y install wget gcc gcc-c++ -y 2.安装libunwind库可以从http://ftp.twaren.net/Unix/NonGNU//libun ...

  9. 'libxml/HTMLparser.h' file not found in ASIHTTPRequest 解决方法

    首先导入libxml2.dylib,具体怎么导入跟导入frameworks一样 然后在Build Setting中的Header Search Paths to: 添加 ${SDK_DIR}/usr/ ...

  10. HDU-统计难题

    DescriptionIgnatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Inp ...